同じ値を持つレコードを30個以上削除する

同じ値を持つレコードを30個以上削除する

大きなCSVがあり、インスタンスが30を超える場合は、名前フィールド($ 8)、中間名フィールド($ 9)、および姓フィールド($ 10)が同じレコードを削除したいと思います。

TYPE|10007|44|Not Available||||CHRISTINE||HEINICKE|||49588|2014-09-15|34
TYPE|1009|44|Not Available||||ELIZABETH||SELIGMAN|||34688|2006-02-12|69
TYPE|102004|44|Not Available||||JANET||OCHS|||11988|2014-09-15|1022
TYPE|1000005|44|Not Available||||KIMBERLY||YOUNG|||1988|2016-10-04|1082

これが私が今まで持っているものです:

awk -F"|" '++seen[tolower($8 || $9 || $10)] <= 30' foo.csv > newFoo.csv

ベストアンサー1

私は、「単純なCSV」ファイル、つまり埋め込み区切り文字または埋め込み改行文字を含むフィールドを含まないファイルを扱っていると仮定します。

30項目を確認した後に表示される項目インスタンスを削除します。

awk -F '|' 'count[$8,$9,$10]++ < 30' file 

また、これらのエントリの最初の30個のインスタンスを削除します。上記の方法を使用して計算し、フィルタリングと出力のためにファイルを再解析できます。

awk -F '|' '!output { ++count[$8,$9,$10]; next } count[$8,$9,$10] <= 30' file output=1 file

パラメータリストでファイルを2回参照し、変数を中間値outputに設定しました。1その後、コードは「カウントモード」(コードの最初のブロック)から「フィルタと出力モード」(最初のブロック以降のテスト)に切り替わります。

使用しているキーを小文字に変更する必要がある場合は、読みやすくするために最初に別々に計算することをお勧めします。

awk -F '|' '
    { key = tolower($8) SUBSEP tolower($9) SUBSEP tolower($10) }
    count[key]++ < 30' file 
awk -F '|' '
    { key = tolower($8) SUBSEP tolower($9) SUBSEP tolower($10) }
    !output { ++count[key]; next }
    count[key] <= 30' file output=1 file

値は、この回答の最初の2つのコードスニペットと同じように、カンマで区切られたキーとして使用されるときに値の間に挿入されるSUBSEP特別な区切り文字です。awk

おすすめ記事