我有一个文件如下:
This is an _PLUTO_
This is _PINEAPPLE_
This is _ORANGE_
This is _RICE_
我使用下面的代码来提取输出:
awk '{ print "Country: " $NF }' report.txt
输出:
Country: _PLUTO_
Country: _PINEAPPLE_
Country: _ORANGE_
Country: _RICE_
如何删除所有下划线以使我的输出如下所示:
Country: PLUTO
Country: PINEAPPLE
Country: ORANGE
Country: RICE
答案1
您可以使用这个片段:
$ awk '{ gsub("_", "", $NF); print "Country: " $NF }' report.txt
Country: PLUTO
Country: PINEAPPLE
Country: ORANGE
Country: RICE
请注意,将就地执行修改,因此根据您的情况,gsub()
它将把替换结果存储回。$NF
如果您使用的是 GNU awk,则可以使用它gensub()
,这稍微简单一些:
$ gawk '{ print "Country: " gensub("_", "", "g", $NF) }' report.txt
Country: PLUTO
Country: PINEAPPLE
Country: ORANGE
Country: RICE
答案2
尝试
awk -F_ '{ print "Country: " $(NF-1) }' infile
你可以尝试一下sed
。
sed -r 's/[^_]*_([^_]*)_.*/Country: \1/' infile
[^_]*_
匹配一切,直到第一次_
看到。([^_]*)_
匹配上述匹配之后的所有内容,直到下一次_
看到并.*
匹配此后的所有内容,但仅保留(...)
部分作为捕获的组。\1
是个反向引用到([^_]*)
被捕获的群体。
答案3
改为使用sed
:
$ sed -E 's/^This is (an? )?/Country: /; s/\<_//; s/_\>//' file
Country: PLUTO
Country: PINEAPPLE
Country: ORANGE
Country: RICE
这适用于三个替换:
This is
将后跟a
或an
的文本替换为Country:
。- 删除
_
单词开头的内容。 _
在单词末尾删除。
最后两个替换允许表格上的数据
This is a _big_blue_ball_
这将被转化为
Country: big_blue_ball
并不是
Country: big blue ball
另一种awk
方法是忽略每行的第一部分并修剪最后一个空格分隔字段的第一个和最后一个字符:
awk '{ printf("Country: %s\n", substr($NF, 2, length($NF)-2)) }'
答案4
使用python完成
#!/usr/bin/python
import re
l=[]
k=open('file.txt','r')
for i in k:
l.append(i)
m=re.compile(r'_.*')
for h in l:
out=re.search(m,h)
print "Country:",out.group().split('_')[-2]
输出
Country: PLUTO
Country: PINEAPPLE
Country: ORANGE
Country: RICE