私はうまくいくべきコードがありますが、うまくいかず、なぜこれが起こるのかを理解しようとしています。こういうわけで、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
実際にそうする必要はありません1。また、これは基本的な作業です。だからこう書くのがより慣用的でしょう。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
これはNR
正当ですが、実際にはほとんど行われません。