コマンドラインとスクリプトでawkを使用した重複排除

コマンドラインとスクリプトでawkを使用した重複排除

次の形式のファイルがあります。

487422,Potenza
487386,Forlì-Cesena
487399,Grosseto
487425,Catanzaro
487409,Napoli
487446,Prato
495498,Fermo
487425,Catanzaro
487389,Macerata
487442,Biella
487351,Asti
487424,Cosenza
487404,Roma
487359,Como
487404,Roma
487401,Terni
487420,Brindisi
487397,Arezzo
487348,Vercelli
487382,Modena
487356,Genova
487365,Cremona
487369,Verona
487386,Forlì-Cesena

ご覧のとおり、重複した内容を含むコンマ区切りのテキストです。を使用して、列1に関連するテキストを削除したいと思いますawk

コマンドライン

シェルインタフェースを使用すると、次の結果が表示されます。

487422,Potenza
487386,Forlì-Cesena
487399,Grosseto
487425,Catanzaro
487409,Napoli
487446,Prato
495498,Fermo
487389,Macerata
487442,Biella
487351,Asti
487424,Cosenza
487404,Roma
487359,Como
487401,Terni
487420,Brindisi
487397,Arezzo
487348,Vercelli
487382,Modena
487356,Genova
487365,Cremona
487369,Verona

これが次のコマンドで期待されるものです。

awk -F"," '!a[$1]++' filename.csv

awkスクリプト

awkスクリプトを使用すると、次のように書きます。

#!/bin/awk -f

BEGIN {
    FS=","
}
{
    {!a[$1]++}
}

私は何の結果も得られません。スクリプトに問題がありますか?スクリプトとコマンドラインの動作が異なるのはなぜですか?

答え1

中かっこの外側に!a[$1]++状況{print}、評価結果がtrue(0以外)の場合、基本操作がトリガーされます。

{{!a[$1]++}}中かっこ内に行動これは無条件に評価され、副作用はありません。中かっこを削除します。

#!/bin/awk -f

BEGIN {
    FS=","
}

!a[$1]++

答え2

@steeldriverの奇妙な答え正確で必要なものかもしれませんが、入力が非常に大きくなると、メモリが不足したり、比較的遅くなる可能性があります。この場合、装飾/整列/装飾解除方法が機能し続ける方法は次のとおりです。

nl -w1 -s, file |       # Decorate by prefixing with line numbers
sort -ut, -k2,2 |       # Sort uniquely by the real key field
sort -nt, -k1,1 |       # Sort whats left by the line numbers we added
cut -d, -f2-            # Undecorate by removing the line numbers

関連情報