web-dev-qa-db-ja.com

awkの最後から2番目の列/フィールドを出力

Awkの最後から2番目の列またはフィールドを印刷したい。フィールドの数は可変です。 $NFを使用できるはずですが、どのように使用できるかはわかりません。

そして、これはうまくいかないようです:

awk ' { print ( $NF-- )  } '
152
Brian G
awk '{print $(NF-1)}'

動作するはずです

258
Chris Kannon

Chris Kannonの受け入れられた答えへの小さな追加:実際に最後の2番目の列がある場合にのみ印刷します。

(
echo       | awk 'NF && NF-1 { print ( $(NF-1) ) }'
echo 1     | awk 'NF && NF-1 { print ( $(NF-1) ) }'
echo 1 2   | awk 'NF && NF-1 { print ( $(NF-1) ) }'
echo 1 2 3 | awk 'NF && NF-1 { print ( $(NF-1) ) }'
)
21
progz

最も簡単です:

 awk '{print $--NF}' 

元の$NF--が機能しなかった理由は、式が減分前に評価されるのに対し、私のプレフィックス減分は評価前に実行されるためです。

13
Steve
awk ' { print ( $(NF-1) ) }' file
9
ghostdog74

あなたは結果からそれほど遠くありませんでした!これはそれを行います:

awk '{NF--; print $NF}' file

これにより、フィールドの数が1つ減り、$NFに前の最後から2番目のフィールドが含まれます。

テスト

いくつかの番号を生成して、5つのグループに印刷してみましょう。

$ seq 12 | xargs -n5
1 2 3 4 5
6 7 8 9 10
11 12

各行の最後から2番目を印刷してみましょう。

$ seq 12 | xargs -n5 | awk '{NF--; print $NF}'
4
9
11
4
fedorqui

Chris Kannonのawkソリューションに似たPerlソリューション:

Perl -lane 'print $F[$#F-1]' file

これらのコマンドラインオプションが使用されます。

  • n入力ファイルのすべての行をループし、すべての行を自動的に印刷しません

  • lは、処理の前に改行を削除し、後でそれらを追加し直します

  • a自動分割モード–入力行を@F配列に分割します。デフォルトは空白で分割します

  • e Perlコードを実行します

@F autosplit配列はインデックス[0]から始まり、awkフィールドは$ 1から始まります。
$#F@Fの要素数です

3
Chris Koknat

Revコマンドを使用して右から左に開始しようとしましたか?この場合、2列目を印刷するだけです。

seq 12 | xargs -n5 | rev | awk '{ print $2}' | rev
4
9
11
2
Fdv

最初に値をデクリメントしてから印刷します-

awk ' { print $(--NF)}' file

OR

rev file|cut -d ' ' -f2|rev
1
VIPIN KUMAR

多くの列があり、最後の3つの列ではなくすべてを印刷する場合、これが役立つ場合があります

awk '{ $NF="";$(NF-1)="";$(NF-2)="" ; print $0 }'

0
Sand1512