提取string的前两个字符(Shell脚本)
我对sed和awk是新手 – 所以我不太确定哪个是最有效的方法。
我正在寻找提取string的前两个字母。 我可以做到,如果他们每次都是一样的,但我似乎无法弄清楚怎么说,
从这个较大的stringx取这个string的n个位置。 
IE浏览器。
USCAGoleta9311734.5021-120.1287855805 = US
 也许最有效的方法是,如果你使用bash shell(你看起来是基于你的注释),就是使用参数扩展的子string变体: 
 pax> long="USCAGol.blah.blah.blah" pax> short="${long:0:2}" ; echo "${short}" US 
 这将成为长的前两个字符。 如果long比两个字符short , short将与它相同。 
这种壳内方法通常会更好,如果你要做很多事情(比如你提到的每个报告50,000次),因为没有创build过程。 所有使用外部程序的解决scheme都会遭受这种开销。
如果你还想确保最小的长度,你可以用手之类的东西来填充:
 pax> long="A" pax> tmpstr="${long}.." pax> short="${tmpstr:0:2}" ; echo "${short}" A. 
 这将确保长度小于两个字符的任何东西都用句号(或者别的,只是通过改变创buildtmpstr时使用的字符)来tmpstr 。 目前尚不清楚你是否需要这个,但我想我会把它完整的。 
 话虽如此,有许多方法可以用外部程序来做到这一点(例如,如果你没有bash可用),其中一些是: 
 short=$(echo "${long}" | cut -c1-2) short=$(echo "${long}" | head -c2) short=$(echo "${long}" | awk '{print substr ($0, 0, 2)}' short=$(echo "${long}" | sed 's/^\(..\).*/\1/') 
 前两个( cut head和head )对于单行string是相同的 – 他们基本上都会把前两个字符给回去。 它们的不同之处在于cut会给出每行的前两个字符,而head会给出整个input的前两个字符 
 第三个使用awk子串函数提取前两个字符,第四个使用sed捕获组(使用()和\1 )捕获前两个字符,并用它们replace整个行。 它们都与cut相似 – 它们inputinput中每行的前两个字符。 
如果你确定你的input是单行的,那么这些都不重要,它们都有相同的效果。
 你已经得到了好几个很好的答案,我自己也和Bash内build人员一起去了,但是既然你问过sed和awk , 几乎没有其他人提供基于它们的解决scheme,我给你提供这些: 
 echo "USCAGoleta9311734.5021-120.1287855805" | awk '{print substr($0,0,2)}' 
和
 echo "USCAGoleta9311734.5021-120.1287855805" | sed 's/\(^..\).*/\1/' 
  awk应该是相当明显的,但是这里是对sed的解释: 
- 用“s /”替代
- 任意字符“..”中的两个“…”组的“()”开头,后面跟着任何字符“。”。 重复零次或多次“*”(反斜杠需要转义一些特殊字符)
- 通过“/”第一个(也是唯一的,在这种情况下)组的内容(这里反斜杠是一个特殊的转义引用一个匹配的子expression式)
- 完成“/”
最简单的方法是
 ${string:position:length} 
 从$position $string中提取$length substring。 
这是一个bash内build的awk或sed不是必需的。
colrm – 删除文件中的列
要留下前两个字符,只需从3开始删除列
 cat file | colrm 3 
 如果你在bash ,你可以说: 
 bash-3.2$ var=abcd bash-3.2$ echo ${var:0:2} ab 
这可能正是你所需要的…
确实晚了,但在这里
 sed 's/.//3g' 
要么
 awk NF=1 FPAT=.. 
要么
 perl -pe '$_=unpack a2' 
只是grep:
 echo 'abcdef' | grep -Po "^.." # ab 
 perl -ple 's/^(..).*/$1/' 
如果mystring = USCAGoleta9311734.5021-120.1287855805
 print substr(mystring,0,2) 
会打印美国
其中0是开始位置,2是多less字符读取
这是你的后?
 my $string = 'USCAGoleta9311734.5021-120.1287855805'; my $first_two_chars = substr $string, 0, 2; 
ref: substr
 如果你的系统使用的是不同的shell(而不是bash ),但是你的系统有bash ,那么你仍然可以通过调用带有variables的bash来使用bash的固有string操作: 
 strEcho='echo ${str:0:2}' # '${str:2}' if you want to skip the first two characters and keep the rest bash -c "str=\"$strFull\";$strEcho;"