条件NR~2
は、レコード番号 NR が 2 に一致するかどうかをチェックします。2 行または 3 行の入力ファイルの場合、式は次のようになります。
if (NR == 2)
NR~3
もちろん、 も同様です。試す:
awk '/2/'
これにより、行のテキスト ( $0
) に 2 が含まれるすべての行が出力されます。デフォルトでは、正規表現は行全体に対して一致します。$3 ~ /3/
たとえば、を使用して特定のフィールドに制限できます。
プログラムはパターンとアクションで構成されawk
、パターンまたはアクションのいずれかを省略できます。
awk '{ if ($0 ~ /2/) print }
/2/
/2/ { if ($0 ~ /a.*z/) print "Matches a.*z"; }'
最初の行にはパターンがありません。のアクションは{ ... }
入力行ごとに実行されます (ただし、条件付きのため、出力を生成するのは一部の入力行のみです。2 を含むすべての行が出力されます ( に引数がない場合、改行が続いprint
て出力されます)。$0
2 行目にはパターンがありますが、アクションはありません。2 を含むすべての行が再度印刷されます。(不足しているアクションは と同等{ print }
です。)
3 行目にはパターンとアクションの両方があります。2 と 'a' の後に 'z' が含まれるすべての行がリマークされます。
これら 2 つのコマンドの違いは何ですか?
`awk '{if(NR~2)print}' sample.txt`
`awk '{if(NR~/^2$/)print}' sample.txt`
最初のコマンドは、行番号 2、12、20..29、32、42、... 102、112、120..129、... 200..299、... を出力します。行番号に 2 が含まれるすべての行。
2 番目のコマンドは、行番号 2 のみを出力します。これ/^2$/
は、値が文字列の開始、数字 2、および文字列の終了を含むように制限されているためです。
ソースが間違っているということですか?
YouTube のリソースを確認しましたが、YouTube が教えようとしていることを誤解されているに違いないと思います。について話すとき、2を含む行番号{if (NR~2) print}
を出力すると言っているはずです。ビデオでは、2、12、20、21、22 などの行番号が引用されています。2 を含む行を言ってはいけません。私はビデオがそれを言っていると思いますが、ビデオは間違っています(しかしテキストは正確でした). NR との比較は実際には間違っていませんが、慣習的ではありません。NR に対する正規表現を説明する紹介ビデオに含めるかどうかはわかりません。そのため、ビデオの音声に不具合があるように見えますが、画面上のテキストは正確だと思います。私はまだ何かを見逃しているかもしれません。awk
awk '{ if ($0 ~ /2/) print }
ファイルに対するコマンドは、sample.txt
私が言及した内容で言うと、出力 2 が一致するだけになります。あれは正しいですか?
入力が与えられたそのコマンド:
2 will be matched
This will not match 2
2 may be matched
3 行すべてを出力します。それらはすべて数字の 2 を含んでいます。
print
アクションも絵柄も だと思いました$0 ~ /2/
。
いいえ; パターンは空でした (開き波括弧の前に何もなかったため) — したがって、すべての行がそれに一致します — そしてアクションは波括弧の部分でした{ if ($0 ~ /2/) print }
. 現在、アクションには条件が含まれていますが、それは別の問題です。
これで、コマンドawk '/2/' sample.txt
は 3 行すべてを出力します。あれは正しいですか?
はい。