web-dev-qa-db-ja.com

awkの最後の5つのフィールドを印刷するにはどうすればよいですか?

10個のフィールドがあり、フィールド5からフィールド10までを開始し、最初の5つのフィールドを無視したい。それを行うためにawkでNFを使用するにはどうすればよいですか?

f1 f2 f3 f4 f5 f6 f7 f8 f9 f10
c1 c2 c3 c4 c5 c6 c7 c8 c9 c10

のみ表示したい:

f6 f7 f8 f9 f10
c6 c7 c8 c9 c10
6
ASAD

フィールドをループする必要があります。

bash-4.3$ awk '{for(i=6;i<=NF;i++) printf $i" "; print ""}' input_file.txt 
f6 f7 f8 f9 f10 
c6 c7 c8 c9 c10 

または、フィールドをNull文字列に等しくすることができます。

bash-4.3$ awk '{for(i=1;i<=5;i++) $i="";print}' input_file.txt 
     f6 f7 f8 f9 f10
     c6 c7 c8 c9 c10

または、行全体の部分文字列を使用して、フィールド6が始まる場所からすべての文字を印刷します( https://stackoverflow.com/a/12900372/3701431 ):

bash-4.3$ awk '{print substr($0,index($0,$6))}' input_file.txt 
f6 f7 f8 f9 f10
c6 c7 c8 c9 c10

または、単にcutコマンドを使用します。

bash-4.3$ cut -d " " -f6-10  input_file.txt 
f6 f7 f8 f9 f10
c6 c7 c8 c9 c10

Pythonもそれを行うことができます。

bash-4.3$ python -c 'import sys;fields=[" ".join(line.strip().split()[5:]) for line in sys.stdin];print "\n".join(fields)' < input_file.txt 
f6 f7 f8 f9 f10
c6 c7 c8 c9 c10

または、代わりに:

$ python -c "import sys;print '\n'.join(map(lambda x:' '.join(x.split()[5:]),sys.stdin.readlines()))" < input_file.txt
f6 f7 f8 f9 f10
c6 c7 c8 c9 c10

またはRubyの場合:

bash-4.3$ Ruby -ne 'print $_.split()[5..10].join(" ");print "\n"' < input_file.txt 
f6 f7 f8 f9 f10
c6 c7 c8 c9 c10

Bash + xargsでもできますが、もう少し複雑です。

bash-4.3$ cat input_file.txt | xargs -L 1 bash -c 'arr=($@);for i in $(seq 5 10);do printf "%s " ${arr[$i]} ; done; echo' sh
f6 f7 f8 f9 f10  
c6 c7 c8 c9 c10 
7

関心のあるフィールドを処理するだけです。実際の最後のフィールドまでは、最後のフィールド-4、最後のフィールド-3になります。

このコンテンツのファイルからの読み取り(file.txt):

f1 f2 f3 f4 f5 f6 f7 f8 f9 f10
c1 c2 c3 c4 c5 c6 c7 c8 c9 c10

以下で説明するように、ファイルに対してawkを実行します。 $記号が付いた行はコマンドです。最後の2行は出力です。

$ awk '{print $(NF-4)" "$(NF-3)" "$(NF-2)" "$(NF-1)" "$NF}' file.txt
f6 f7 f8 f9 f10
c6 c7 c8 c9 c10

:Cyrusがコメントで指摘したように、bashスクリプトを削除し、printステートメントのみを残して、よりシンプルで高速にしています。

3
L. D. James