awk コードの説明

awk コードの説明

動作するはずのコードがいくつか提供されたのですが、動作しません。その理由を理解しようとしています。そのために 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==NRFNR>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コードがFNRand/orを変更しない限りNR- これは合法ですが、実際にはほとんど行われません。

関連情報