Awkでは、2ドルが2番目の列であることを学びました。 i行目とj列目のi行目と要素を指定する方法は?
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}'
特定の文字列で列を印刷するには、//検索パターンを使用します。たとえば、abcを含む2番目の列を探している場合:
awk '$2 ~ /abc/'
...特定の列のみを印刷する場合:
awk '$2 ~ /abc/ { print $3 }'
...および特定の行番号の場合:
awk '$2 ~ /abc/ && FNR == 5 { print $3 }'
デニスの答えを拡張するには、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}'
この作業コマンドを見つけました
root @ gateway:/ home/sshuser#aws ec2 describe-instances --instance-ids i-2db0459d | grep 'STATE\| TAG' | awk 'FNR == 1 {print $ 1}'
状態
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番目の要素です。$.
は行番号です