を使用してファイル比較を学習していますawk
。
以下のような構文を見つけました、
awk 'NR==FNR{a[$1];next}$1 in a{print $1}' file1 file2
NR==FNR
これの意味がわからなかったのですか?試してみるとFNR==NR
、同じ出力が得られますか?
それは正確に何をしますか?
を使用してファイル比較を学習していますawk
。
以下のような構文を見つけました、
awk 'NR==FNR{a[$1];next}$1 in a{print $1}' file1 file2
NR==FNR
これの意味がわからなかったのですか?試してみるとFNR==NR
、同じ出力が得られますか?
それは正確に何をしますか?
回答:
awkではFNR
、現在のファイルのレコード番号(通常は行番号)をNR
参照し、合計レコード番号を参照します。演算子==
は比較演算子であり、周囲の2つのオペランドが等しい場合にtrueを返します。
これは、各ファイルの最初の行で1にリセットされるが、増加し続けるNR==FNR
ため、条件は最初のファイルに対してのみ真であることを意味しFNR
ますNR
。
このパターンは通常、最初のファイルに対してのみアクションを実行するために使用されます。next
彼らは唯一の最初以外のファイル上で実行されているので、それ以上のコマンドは、スキップされるブロック手段の内部。
条件FNR==NR
は、と同じ2つのオペランドを比較するNR==FNR
ため、同じように動作します。
a='3x'; if [[ $a == 3* ]]; then echo yes; fi
そして、の両側を切り替えることはできません==
。
file1にもあるfile2のキー(行の最初の単語)を探します。
ステップ1:配列aにファイル1の最初の単語を入力します。
awk '{a[$1];}' file1
手順2:同じコマンドで配列aを入力し、ファイル2を無視します。このために、現在の入力ファイルの数でこれまでのレコードの総数を確認してください。
awk 'NR==FNR{a[$1]}' file1 file2
ステップ3:}
ファイル1を解析するときに発生する可能性のあるアクションを無視する
awk 'NR==FNR{a[$1];next}' file1 file2
ステップ4:配列aで見つかったときにfile2のキーを出力する
awk 'NR==FNR{a[$1];next} $1 in a{print $1}' file1 file2
;next
が、奇妙な追加です(next
ステップ3でセミコロンを追加して必要とするようなものです)。ステップ1はawk '{a[$1]} END { for (k in a) { print "a[k]=" k } }' file1
。でテストできます。
見上げるNR
とFNR
awkでのマニュアルと、その後の下で条件が何であるかを自問してみてくださいNR==FNR
、次の例では:
$ cat file1
a
b
c
$ cat file2
d
e
$ awk '{print FILENAME, NR, FNR, $0}' file1 file2
file1 1 1 a
file1 2 2 b
file1 3 3 c
file2 4 1 d
file2 5 2 e
ARGIND
ですFNR==1{ print ++file_nr }
。それ以外の場合は、を実行できます。
ファイルa.txtとb.txtがあると仮定します。
cat a.txt
a
b
c
d
1
3
5
cat b.txt
a
1
2
6
7
NRとFNRはawkの組み込み変数であることに注意してください。NR-処理されたレコードの総数を示します。(この場合、a.txtとb.txtの両方)FNR-各入力ファイルのレコードの総数を示します(a.txtまたはb.txtのいずれかのレコード)
awk 'NR==FNR{a[$0];}{if($0 in a)print FILENAME " " NR " " FNR " " $0}' a.txt b.txt
a.txt 1 1 a
a.txt 2 2 b
a.txt 3 3 c
a.txt 4 4 d
a.txt 5 5 1
a.txt 6 6 3
a.txt 7 7 5
b.txt 8 1 a
b.txt 9 2 1
「次へ」を追加して、NR == FNRと一致する最初の一致をスキップします
b.txtおよびa.txt
awk 'NR==FNR{a[$0];next}{if($0 in a)print FILENAME " " NR " " FNR " " $0}' a.txt b.txt
b.txt 8 1 a
b.txt 9 2 1
b.txtにはありますが、a.txtにはありません
awk 'NR==FNR{a[$0];next}{if(!($0 in a))print FILENAME " " NR " " FNR " " $0}' a.txt b.txt
b.txt 10 3 2
b.txt 11 4 6
b.txt 12 5 7
awk 'NR==FNR{a[$0];next}!($0 in a)' a.txt b.txt
2
6
7
a==b
とb==a
同じ結果を生成しましたか?