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
フィールドをループする必要があります。
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
関心のあるフィールドを処理するだけです。実際の最後のフィールドまでは、最後のフィールド-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ステートメントのみを残して、よりシンプルで高速にしています。