如何使用awk获取指定位置任一侧的子串

时间:2015-03-06 16:44:43

标签: regex awk sed

我使用awk来获取基于位置变量的子字符串。想象:

string = "ABC NGC 2345678."
echo $string | awk '{print substr($0,5,8)}'

输出:

"NGC 2345"

这很好,但是如果我想在位置5的两侧提取8个字母呢?或者更好的是,因为只有5个位置存在倒退,如何推广这个位置以获得“在感兴趣位置的任何一侧最多8个位置?”

以便输出

"ABC NGC 2345"

感谢。

2 个答案:

答案 0 :(得分:1)

你可以在这里使用sed。

$ echo "ABC NGC 2345678." | sed 's/^\(.\{4\}..\{0,7\}\).*/\1/'
ABC NGC 2345

答案 1 :(得分:1)

我认为您可能希望拥有通用解决方案,而不仅仅是解决您的示例问题。

看看这个awk one-liner:

awk -v i=5 -v o=8 '{d=i-o;s=d>0?d:1;print substr($0,s,2*o+(d<0?d:1))}'

您只需更改i ( interesting position)o (the offset to each side)

即可

让我们做一个测试:

kent$  str="54321#123456789"                                                                                                                                                

kent$  awk -v i=6 -v o=3 '{d=i-o;s=d>0?d:1;print substr($0,s,2*o+(d<0?d:1))}'<<<$str                                                                                
321#123

kent$  awk -v i=6 -v o=5 '{d=i-o;s=d>0?d:1;print substr($0,s,2*o+(d<0?d:1))}'<<<$str                                                                                
54321#12345

kent$  awk -v i=6 -v o=7 '{d=i-o;s=d>0?d:1;print substr($0,s,2*o+(d<0?d:1))}'<<<$str                                                                                
54321#1234567

kent$  awk -v i=6 -v o=77 '{d=i-o;s=d>0?d:1;print substr($0,s,2*o+(d<0?d:1))}'<<<$str
54321#123456789