내 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
.
위에서는 각 키가 처음 발생한 이후의 행뿐만 아니라 중복 키가 있는 모든 행을 인쇄한다고 가정합니다.