提取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比两个字符shortshort将与它相同。

这种壳内方法通常会更好,如果你要做很多事情(比如你提到的每个报告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 headhead )对于单行string是相同的 – 他们基本上都会把前两个字符给回去。 它们的不同之处在于cut会给出每行的前两个字符,而head会给出整个input的前两个字符

第三个使用awk子串函数提取前两个字符,第四个使用sed捕获组(使用()\1 )捕获前两个字符,并用它们replace整个行。 它们都与cut相似 – 它们inputinput中每行的前两个字符。

如果你确定你的input是单行的,那么这些都不重要,它们都有相同的效果。

你已经得到了好几个很好的答案,我自己也和Bash内build人员一起去了,但是既然你问过sedawk几乎没有其他人提供基于它们的解决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;"