コマンドライン履歴を含むHistory.txtファイルから重複エントリを削除するコード。
BEGIN{
if (data[$0]++ == 0)
lines[++count] = $0;
}
END {
for(i=1; i<count; i++)
print lines[i];
}
data
コードには何があり、なぜと比較されますか0
?
答え1
これは入力の一意の行を記憶するためのものです。
Jeff Schallerが指摘したように、$0
ブロックに定義されていません。BEGIN
より正確なコードは
{
if (data[$0]++ == 0)
lines[++count] = $0;
}
END {
for(i=1; i<count; i++)
print lines[i];
}
でも
!data[$0]++ { lines[++count] = $0; }
END {
for(i=1; i<count; i++)
print lines[i];
}
行の最初の出現はdata[$0]
ゼロに等しく、対応するline[ ]
行が受信されます。
テスト後はdata[$0]
増加し(++
例後増加)、同じ内容の行に対してテストはfalseと評価されます。
このEND
ステートメントはすべての行を順番に印刷します。
また、見ることができますawk '!a[$0]++' はどのように機能しますか?