我使用awk来获取基于位置变量的子字符串。想象:
string = "ABC NGC 2345678."
echo $string | awk '{print substr($0,5,8)}'
输出:
"NGC 2345"
这很好,但是如果我想在位置5的两侧提取8个字母呢?或者更好的是,因为只有5个位置存在倒退,如何推广这个位置以获得“在感兴趣位置的任何一侧最多8个位置?”
以便输出
"ABC NGC 2345"
感谢。
答案 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