awk
構文を使用してコマンドを実行すると、NR== /regex/
予期しない結果が表示されます。文書の内容:
cat file
## This is
## a
## b
## c
## end
## e
## f
## g
次に、ファイルの先頭に空白行を追加します。
sed '1 s.^.\n.' file >file2
次のように別の行を追加します。
sed '1 s.^.user288752 is back\n.' file2 >file3
次に、3つのファイルに対して次のコマンドを実行します。
awk 'NR== /is/, /end/' file
## This is
## a
## b
## c
## end
awk 'NR== /is/, /end/' file2
file2にawk
一致するものがありません。
awk 'NR== /is/, /end/' file3
## user288752 is back
##
## This is
## a
## b
## c
## end
is
私の考えでは、1行目に出てくる場合にのみ一致するようです。しかし、私は$0 ~ /is/
このコマンドを書きませんでした。そしてis
NRと同じではありません。is
この場合、regex()であることを知っていますが、/is/
なぜis
NRと一致するのですか?私は何を見逃していますか?
答え1
一度見てみましょうNR == /is/
。
これは次のように書き直すことができますNR == ( /is/ )
。これは2つのブールテストです。
/is/
is
、文字列が現在のレコード(行)にある場合はtrueです。NR == something
、入力ラインにある場合、これは正しいですsomething
。
このawk
言語では、値は本物は1なので、もし/is/
そうなら本物/is/
、1になります。文字列を含む各行の式は1ですis
。最初のファイルはis
行 1 にあり、2 番目のファイルは行is
2 にあり、3 番目のファイルはis
行 1 と 3 にあります。
$ awk '{ printf "NR: %d\t/is/: %d\n", NR, /is/ }' file1
NR: 1 /is/: 1
NR: 2 /is/: 0
NR: 3 /is/: 0
NR: 4 /is/: 0
NR: 5 /is/: 0
NR: 6 /is/: 0
NR: 7 /is/: 0
NR: 8 /is/: 0
$ awk '{ printf "NR: %d\t/is/: %d\n", NR, /is/ }' file2
NR: 1 /is/: 0
NR: 2 /is/: 1
NR: 3 /is/: 0
NR: 4 /is/: 0
NR: 5 /is/: 0
NR: 6 /is/: 0
NR: 7 /is/: 0
NR: 8 /is/: 0
NR: 9 /is/: 0
$ awk '{ printf "NR: %d\t/is/: %d\n", NR, /is/ }' file3
NR: 1 /is/: 1
NR: 2 /is/: 0
NR: 3 /is/: 1
NR: 4 /is/: 0
NR: 5 /is/: 0
NR: 6 /is/: 0
NR: 7 /is/: 0
NR: 8 /is/: 0
NR: 9 /is/: 0
NR: 10 /is/: 0
今、私たちは/is/
いくつかのラインでは1であることを知っています。これはNR == /is/
、テストが次のように進行することを意味します。本物/is/
が1と同時に1の場合、入力行が計算されるため、NR
入力の最初の行にのみ存在できます(存在する場合)。NR
3つのファイルのうち最初と最後のファイルはこの条件を満たしますが、2番目のファイルはそうではありません。