![awk コードの説明](https://rvso.com/image/168819/awk%20%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E8%AA%AC%E6%98%8E.png)
動作するはずのコードがいくつか提供されたのですが、動作しません。その理由を理解しようとしています。そのために bash と awk を学ぼうとしているのですが、とても混乱しています。誰かがこの awk コードを理解するのを手伝ってくれたら、本当にうれしいです。
cvgMids.txt
次の形式の行が多数含まれます
<http://rdf.freebase.com/ns/g.11b74p1stp> <http://rdf.freebase.com/ns/type.object.type> <http://rdf.freebase.com/ns/cvg.video_game_soundtrack> .
<http://rdf.freebase.com/ns/g.11bc4msmrn> <http://rdf.freebase.com/ns/type.object.type> <http://rdf.freebase.com/ns/cvg.cvg_developer> .
<http://rdf.freebase.com/ns/g.11bxxz28q6> <http://rdf.freebase.com/ns/type.object.type> <http://rdf.freebase.com/ns/cvg.computer_videogame> .
BEGIN{i=0;}
次の行のいずれにも変数 i が使用されていないのはなぜでしょうか。何
<(cat cvgMids.txt) <(gzip -dc freebase-rdf-latest.gz) > cvg_predicates.txt
のためですか? awk の最後にファイルを置くのはわかりますが、括弧などが多くて混乱します。
awk 'BEGIN{i=0;}
FNR == NR {
if($1 in a) next;
a[$1] = $1;
next
}
FNR<NR {
if($1 in a) {print $0;}}' <(cat cvgMids.txt) <(gzip -dc freebase-rdf-latest.gz) > cvg_predicates.txt
答え1
freebase-rdf-latest.gz
このスニペットは、 の最初の空白で区切られたフィールドが の$1
最初の空白で区切られたフィールドのいずれかと一致する、 の非圧縮コンテンツから行を出力しているように見えますcvgMids.txt
。ただし、もっと簡単に記述することもできます。
特に:
あなたが指摘したように、
i
どこにも使用されていないので、BEGIN
ブロックは削除される可能性がありますシーケンス
if($1 in a) next; a[$1] = $1; next
削減できる
a[$1]; next
(配列の価値観決して使用されず、インデックスのみが使用され、テストして条件付きで割り当てるのと同じくらい、インデックスを複数回再割り当てする方が効率的です)
ルールアクション
FNR<NR { if($1 in a) {print $0;}}
FNR<NR
すでにこのケースに対処しておりFNR==NR
、はFNR>NR
発生しないので、は必要ありません。また、はデフォルトのアクションです。したがって、 と書く方が慣用的です。{print $0;}
$1 in a
<(cat cvgMids.txt)
そして<(gzip -dc freebase-rdf-latest.gz)
シェルプロセスの置換機能的には、最初のcvgMids.txt
ものは(猫の無駄使いリダイレクトの無駄な使用。おそらく美観上の理由で使用されたのでしょう。
これらすべてをまとめると、
awk 'FNR == NR {a[$1]; next} $1 in a' cvgMids.txt <(gzip -dc freebase-rdf-latest.gz) > cvg_predicates.txt
ただし、オリジナルが機能しない場合は、簡易バージョンも機能しません。
1コードがFNR
and/orを変更しない限りNR
- これは合法ですが、実際にはほとんど行われません。