awkを使用して最後の2列を印刷する方法


106

私が欲しいのは、印刷された最後の2つの列だけです。


6
なぜこれが87の賛成票を持っているのかよくわかりませんが、少なくとも例を挙げれば確実に改善できます。
Arj

おそらく、その質問は本質的に非常に単純で、例がなくても簡単に理解できるためですが、これはまれですが、この場合は問題がないようです。ここでの問題は、私が考える情報の不足ではありませんが、それ以上に、独立した研究の不足を示しています。
DryLabRebel

この質問はまた、重複しているこの質問。
DryLabRebel

これはあなたの質問に答えますか?awkで最後の2番目の列/フィールドを印刷する
DryLabRebel

回答:


194

NF入力レコードのフィールドの総数に設定された変数を使用できます。

awk '{print $(NF-1),"\t",$NF}' file

これは、少なくとも2つのフィールドがあることを前提としています。


1
カンマが必要です-今日はうるさいので、スペースはフィールドを連結し、カンマはprintステートメントのフィールドを区切ります。これで2つのフィールドがマージされます
jim mcnamara

18
これで、「field-OFS-tab-OFS-field」を印刷しています。awk '{print $(NF-1) "\t" $NF}' fileまたはawk '{print $(NF-1), $NF}' fileまたはである必要がありますawk 'BEGIN{OFS="\t"} {print $(NF-1), $NF}' file
追って通知があるまで一時停止。

前のコメントに追加すると、使用の問題'{print $x,"\t",$y}'は、awkが各コンマ区切りの変数を独自のフィールドとして解釈するため、結果は実際にはになりますfield1<space><tab><space>field2(デフォルトでは空白区切り文字が使用されるため)field1<tab>field2これとは対照的にあなたが期待している。ほとんどの場合、出力フィールドセパレーター(OFS)を使用することをお勧めします。
DryLabRebel

13
awk '{print $NF-1, $NF}'  inputfile

注:これは、少なくとも2つの列が存在する場合にのみ機能します。1列のレコードでは、誤った結果が得られます"-1 column1"


3
試してみてください。Solaris 9 awk&nawkで動作します。代わりは$(NF-1)です
jim mcnamara

1
@coaddict-別のawk実装で作業したことがないと思います。古いawksの振る舞いは(おそらく誤って)提起されました。私にはテストするgawkがありません-これはおそらくあなたが参照しているものです。ですから、あなたのコメントがなぜ拒否されたのか、私にはわかりません。通常、Linux awkはそのままgawkです。テストしてポストバックします。それまでの間、Soalris、HPUX、DGXなどを試して、古いawkの意味を確認してください。
ジムマクナマラ2010年

6
たぶんあなたはそれを試しecho 1 2 3 | awk ...たので、それがうまくいったと思って騙されました。$NF-1ある($NF) - 1すべての中でawk実施。
Stephane Chazelas 14

「One True Awk」ソースコードのyacc文法には40以上の競合があります。これは、Aがawkで何を表すかを考えると皮肉なことです。異なるバージョンのawkが物事を異なる方法で解析していますか?ビッグサプライズ!
Kaz

1
@THESorcerer、echo '5 4 3 2 1' | awk '{print $NF-1,$NF; print $(NF-1), $NF}'最後の2番目のフィールドが最後のフィールドよりも1だけ小さくない-またはその他の入力で試してください。
グレン・ジャックマン2018

6

@jimマクナマラ:周りのために括弧を使用してみてくださいNF、すなわち $(NF-1)$(NF)の代わり$NF-1$NFする(Mac OS X 10.6.8上の作品FreeBSD用awkgawk)。

echo '
1 2
2 3
one
one two three
' | gawk '{if (NF >= 2) print $(NF-1), $(NF);}'

# output:
# 1 2
# 2 3
# two three

()は以前に検討済みです。私たちは元々の古いawkの振る舞いがどこから来たかについて話し合っていると思っていました。
ジムマクナマラ2013年

+1は、明示的です。$(NF-1)少なくとも、より移植性があり$NF-1ます。あいまいさが少なくなります。$(NF)しかし、やりすぎです- $NFやるだけです。1列の行では最初の列の値が2回取得されるため、2列未満の行から保護することも価値があります。0列の場合、つまり空の行の場合、awkコマンドは試行により完全に失敗しますインデックス-1のフィールドにアクセスします。
mklement0 2014

1

gawkを使用すると問題が発生します。

 gawk '{ print $NF-1, $NF}' filename
1 2
2 3
-1 one
-1 three
# cat filename
1 2
2 3
one
one two three

私はSolaris 10 M4000にgawkを追加しました。つまり、gawkは$ NF-1と$(NF-1)の問題のカプリットです。次の質問POSIXは何と言っていますか?あたり:

http://www.opengroup.org/onlinepubs/009695399/utilities/awk.html

どちらの方向にも方向性はありません。良くない。gawkは減算を意味し、他のawksはフィールド番号または減算を意味します。うーん。


1
サンプル入力ファイルの最初の2行は、どちらの動作で同じ出力を生成するため、役に立ちません。この場合、Solaris awkが実際にgawkのように動作しないことを再確認してください。
mklement0 2014

awkの仕様へのあなたのリンクについて:使用するための逸話引数は$(NF-1):そのスペックに形成することの両方を使用するフィールドインデックスを計算する2つの例である$(NF-1)$(NF+2)。次に、「式のawk」セクションがあります。これには$expr、よりも[はるかに]高い優先順位があることが示されていますexpr - exprNFは式そのものなので、に$NF-1評価され($NF)-1ます。結局のところ、結局のところ、$NF-1として評価されるawk実装が実際に存在する場合でも、$(NF-1)ここで学んだ教訓は、使用$(NF-1)が安全で移植可能な選択であることです。
mklement0 2014

0

これで試して

$ cat /tmp/topfs.txt
/dev/sda2      xfs        32G   10G   22G  32% /

awk print last column
$ cat /tmp/topfs.txt | awk '{print $NF}'

awk print before last column
$ cat /tmp/topfs.txt | awk '{print $(NF-1)}'
32%

awk - print last two columns
$ cat /tmp/topfs.txt | awk '{print $(NF-1), $NF}'
32% /

0

これを試して、考えられるすべてのシナリオを考慮してください。

awk '{print $(NF-1)"\t"$NF}'  file

または

awk 'BEGIN{OFS="\t"}' file

または

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