파일에서 중복 레코드만 식별하고 중복 레코드만 새 파일에 인쇄

파일에서 중복 레코드만 식별하고 중복 레코드만 새 파일에 인쇄

내 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

거의 다 왔어요! 입력 파일을 두 번(일부 수정 포함) 처리하면 됩니다. 처음에는 기준(열 #1, #3, #4)에 따라 중복 개수를 찾고 두 번째에는 count>가 있는 해당 행에 대한 출력 파일을 필터링해야 합니다. 1 그래서:

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

답변2

입력은 키 값별로 그룹화되므로 하나의 입력에서 이 작업을 수행하고 한 번에 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.

위에서는 각 키가 처음 발생한 이후의 행뿐만 아니라 중복 키가 있는 모든 행을 인쇄한다고 가정합니다.

관련 정보