ファイル内の重複レコードのみを識別し、重複レコードのみを新しいファイルに印刷する

ファイル内の重複レコードのみを識別し、重複レコードのみを新しいファイルに印刷する

私のCSVファイルには、列1、3、4に重複レコードがある10個の列がたくさんあります。これらの重複履歴は識別され、別々のTXTファイルに保存されなければなりません。ファイルは「,」で区切られます。

たとえば、

14479305,I,101013000000,I,31/03/2019,TD01,16573.34,0,C,6/03/2015
14479305,I,101013000000,I,31/03/2019,TD01,16573.34,0,C,6/03/2015
14479305,I,101013000000,I,31/03/2019,TD01,6591.5,0,O,23/03/2015
14479305,I,101013000000,I,31/03/2019,TD01,305592.33,0,C,27/07/2017
13256433,I,101095000000,I,31/03/2019,TD21,102992.06,0,C,20/03/2017
13256492,I,101095000000,I,31/03/2019,TD21,102992.06,0,C,20/03/2017
11595044,I,101225000000,I,31/03/2019,TD01,70000,0,O,14/10/2016
13222989,I,101296000000,I,31/03/2019,TD01,53850,0,O,21/09/2018
13222989,I,101296000000,I,31/03/2019,TD01,534850,0,O,21/09/2019

結果ファイル

14479305,I,101013000000,I,31/03/2019,TD01,16573.34,0,C,6/03/2015
14479305,I,101013000000,I,31/03/2019,TD01,6591.5,0,O,23/03/2015
14479305,I,101013000000,I,31/03/2019,TD01,305592.33,0,C,27/07/2017
13222989,I,101296000000,I,31/03/2019,TD01,53850,0,O,21/09/2018
13222989,I,101296000000,I,31/03/2019,TD01,534850,0,O,21/09/2019

私が書いたがうまくいかなかったAWKコマンドは次のとおりです。

awk -F, 'dups{a[$1,$3,$4]++; next} a[$1,$3,$4]>1' source.CSV > Dups.txt

アドバイスしてください

答え1

ほぼ全部来ました!入力ファイルを2回(一部の修正を含む)処理するだけです。最初は条件(列#1、#3、#4)に基づいて重複数を探し、2番目はcount>を持つその行の出力ファイルをフィルタリングする必要があります。 1だから:

awk -F, 'NR==FNR{ dups[$1,$3,$4]++; next} dups[$1,$3,$4]>1' source.CSV source.CSV > Dups.txt

答え2

入力はキー値でグループ化されているため、1つの入力でこれを実行し、一度に1行だけメモリに保存できます。

$ cat tst.awk
BEGIN { FS = "," }
{ key = $1 FS $3 FS $4 }
key == prevKey {
    print prevRec $0
    prevRec = ""
    next
}
{
    prevRec = $0 ORS
    prevKey = key
}

$ awk -f tst.awk file
14479305,I,101013000000,I,31/03/2019,TD01,16573.34,0,C,6/03/2015
14479305,I,101013000000,I,31/03/2019,TD01,16573.34,0,C,6/03/2015
14479305,I,101013000000,I,31/03/2019,TD01,6591.5,0,O,23/03/2015
14479305,I,101013000000,I,31/03/2019,TD01,305592.33,0,C,27/07/2017
13222989,I,101296000000,I,31/03/2019,TD01,53850,0,O,21/09/2018
13222989,I,101296000000,I,31/03/2019,TD01,534850,0,O,21/09/2019

このようにグループ化されていない場合は、次のようにしますsort -t, -k1,1 -k3,4 file | awk -f tst.awk

上記では、各キーが最初に発生した後の行だけでなく、重複キーを持つすべての行も印刷しているとします。

関連情報