如何使用awk删除下划线字符

如何使用awk删除下划线字符

我有一个文件如下:

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

请参阅 GNU awk 文档gsub()gensub()更多细节。

答案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

这适用于三个替换:

  1. This is将后跟aan的文本替换为Country:
  2. 删除_单词开头的内容。
  3. _在单词末尾删除。

最后两个替换允许表格上的数据

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

相关内容