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


164

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

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

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

10
NFは最後のフィールドインデックス、$NFは最後のフィールドの値
グレンジャックマン

それは今理にかなっています。それが、括弧の外のドルが機能する理由だと思います
ブライアンG

回答:


279
awk '{print $(NF-1)}'

うまくいくはず


2
これは私にはうまくいきません。Ubuntuのawk 3.1.8で「title:5:コマンドが見つかりません:NF-1」と表示されます。
Gurgeh、2012年

3
$ NFの値を変更しないようにするために、前後の減少を避けます
グレゴリーパトモア、2015

最後の3番目のフィールドを取得しようとすると、これは壊れますawk -F '.' '{print $(NF-2)}'
gies0r

3
@Gurgeh:これ$(..)は、使用しているシェルに応じてサブシェルでコマンドを呼び出すために発生します。の$ (NF-1)代わりにを使用して、これを回避でき$(NF-1)ます。
2018年

21

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) ) }'
)

15

最も簡単です:

 awk '{print $--NF}' 

オリジナル$NF--が機能しなかった理由は、式がデクリメントの前に評価されるのに対し、プレフィックスのデクリメントは評価の前に実行されるためです。


ニーモニックとして、この動作はC / Javaなどと同じint x = ++i int x = i++です。接頭辞は最初にインクリメントすることを意味します。postfixは後でインクリメントすることを意味します(割り当てが最初)。
週末


4

あなたは結果から遠くない!これはそれを行います:

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

3

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

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

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

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

  • l 処理前に改行を削除し、後で追加します

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

  • e Perlコードを実行する

@Fawkのフィールドは$ 1を開始しながら、自動split配列[0]インデックスから始まります。
$#Fは要素数です@F


1
または、perlによってすでに提供されている負のインデックスを使用します...$F[-2]
Sundeep

2

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

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

1

最初に値を減らしてから、それを出力します-

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

または

rev file|cut -d ' ' -f2|rev

0

多くの列があり、最後の3つの列を除くすべてを印刷したい場合、これは役立つかもしれません

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.