Awkの最後から2番目の列またはフィールドを印刷したい。フィールドの数は可変です。 $NF
を使用できるはずですが、どのように使用できるかはわかりません。
そして、これはうまくいかないようです:
awk ' { print ( $NF-- ) } '
awk '{print $(NF-1)}'
動作するはずです
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) ) }'
)
最も簡単です:
awk '{print $--NF}'
元の$NF--
が機能しなかった理由は、式が減分前に評価されるのに対し、私のプレフィックス減分は評価前に実行されるためです。
awk ' { print ( $(NF-1) ) }' file
あなたは結果からそれほど遠くありませんでした!これはそれを行います:
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
Chris Kannonのawkソリューションに似たPerlソリューション:
Perl -lane 'print $F[$#F-1]' file
これらのコマンドラインオプションが使用されます。
n
入力ファイルのすべての行をループし、すべての行を自動的に印刷しません
l
は、処理の前に改行を削除し、後でそれらを追加し直します
a
自動分割モード–入力行を@F
配列に分割します。デフォルトは空白で分割します
e
Perlコードを実行します
@F
autosplit配列はインデックス[0]から始まり、awkフィールドは$ 1から始まります。$#F
は@F
の要素数です
Revコマンドを使用して右から左に開始しようとしましたか?この場合、2列目を印刷するだけです。
seq 12 | xargs -n5 | rev | awk '{ print $2}' | rev
4
9
11
最初に値をデクリメントしてから印刷します-
awk ' { print $(--NF)}' file
OR
rev file|cut -d ' ' -f2|rev
多くの列があり、最後の3つの列ではなくすべてを印刷する場合、これが役立つ場合があります
awk '{ $NF="";$(NF-1)="";$(NF-2)="" ; print $0 }'