web-dev-qa-db-ja.com

awkで行と要素を選択する

Awkでは、2ドルが2番目の列であることを学びました。 i行目とj列目のi行目と要素を指定する方法は?

59
Tim

2行目を印刷するには:

awk 'FNR == 2 {print}'

2番目のフィールドを印刷するには:

awk '{print $2}'

5行目の3番目のフィールドを印刷するには:

awk 'FNR == 5 {print $3}'

次に、ヘッダー行と(冗長な)フィールドの説明を含む例を示します。

awk 'BEGIN {print "Name\t\tAge"}  FNR == 5 {print "Name: "$3"\tAge: "$2}'

ちなみに、「\ t\t」よりも列を揃える方が良い方法があります。

ファイル全体を処理する理由がない場合、目的のレコードを印刷したらすぐにexitを使用して停止します。

awk 'FNR == 2 {print; exit}'
133

特定の文字列で列を印刷するには、//検索パターンを使用します。たとえば、abcを含む2番目の列を探している場合:

awk '$2 ~ /abc/'

...特定の列のみを印刷する場合:

awk '$2 ~ /abc/ { print $3 }'

...および特定の行番号の場合:

awk '$2 ~ /abc/ && FNR == 5 { print $3 }'
26
Hai Vu

デニスの答えを拡張するには、awk-vオプションはiおよびj値を渡す:

# print the j'th field of the i'th line
awk -v i=5 -v j=3 'FNR == i {print $j}'
22
glenn jackman

この作業コマンドを見つけました

root @ gateway:/ home/sshuser#aws ec2 describe-instances --instance-ids i-2db0459d | grep 'STATE\| TAG' | awk 'FNR == 1 {print $ 1}'

状態

0
Mansur Ali

AwkとPerlは密接に関連しているため...


@Dennisのawkソリューションと同等のPerl:

2行目を印刷するには:
Perl -ne 'print if $. == 2' file

2番目のフィールドを印刷するには:
Perl -lane 'print $F[1]' file

5行目の3番目のフィールドを印刷するには:
Perl -lane 'print $F[2] if $. == 5' file


@Glennのソリューションに相当するPerl:

I番目の行のj番目のフィールドを出力します

Perl -lanse 'print $F[$j-1] if $. == $i' -- -i=5 -j=3 file


@Haiのソリューションに相当するPerl:

abcを含む2番目の列を探している場合:

Perl -lane 'print if $F[1] =~ /abc/' foo

...特定の列のみを印刷する場合:

Perl -lane 'print $F[2] if $F[1] =~ /abc/' foo

...および特定の行番号の場合:

Perl -lane 'print $F[2] if $F[1] =~ /abc/ && $. == 5' foo


-lは改行を削除し、印刷時にそれらを再び追加します
-aは、空白を区切り文字として使用して、入力行を配列@Fに自動分割します
-n入力ファイルの各行をループします
-e引用符内のコードを実行します
$F[1]は、Perlが0で始まるため、配列の2番目の要素です。
$.は行番号です

0
Chris Koknat