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

gensub()GNU awkを使用している場合は、少し簡単なthisを使用できます。

$ gawk '{ print "Country: " gensub("_", "", "g", $NF) }' report.txt
Country: PLUTO
Country: PINEAPPLE
Country: ORANGE
Country: RICE

GNU awk ドキュメントをご覧ください。gsub()そしてジェンソプ()詳細については。

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

これは3つの代替に適用されます。

  1. This is次のテキストをaまたはanに置き換えますCountry:
  2. _単語の先頭を削除します。
  3. _単語の末尾から削除します。

最後の 2 つの置換はテーブルのデータを受け入れます。

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

関連情報