大きな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