첫 번째 열에서 첫 번째 중복 행 제거

첫 번째 열에서 첫 번째 중복 행 제거

다음과 유사한 구조를 가진 큰 csv 파일이 있습니다.

334050049049426,2018-11-06T20:21:56.591Z,xxx,gdl-qns28-1540279057144
334050049049426,2018-11-06T21:32:47.431Z,xxx,gdl-qns19-1540278993723
334090015032064,2018-11-06T22:22:31.247Z,xxx,gdl-qns15-1540279009813
334090015032064,2018-11-07T01:44:11.442Z,xxx,gdl-qns25-1540279437614
334090015032064,2018-11-07T03:57:18.911Z,xxx,gdl-qns28-1540279710160
334050069888299,2018-11-07T03:32:12.899Z,xxx,gdl-qns29-1540279367769
334050069888299,2018-11-07T03:58:15.475Z,xxx,mgc-qns20-1540281468455

첫 번째 열에서 발견된 중복 값의 첫 번째 행을 제거할 수 있어야 합니다. 예를 들어 행 1, 3, 6을 제거해야 합니다.

답변1

awk고유한 첫 번째 열이 있는 행이 없으면 다음을 시도해 보세요.

awk -F, 'pre==$1 { print; next }{ pre=$1 }' infile

또는 일반적으로 다음과 같이 변경합니다.

awk -F, 'pre==$1 { print; is_uniq=0; next }
                 # print when current& previous lines' 1st column were same
                 # unset the 'is_uniq=0' variable since duplicated lines found

         is_uniq { print temp }
                 # print if previous line ('temp' variable keep a backup of previous line) is a 
                 # uniq line (according to the first column)

                 { pre=$1; temp=$0; is_uniq=1 }
                 # backup first column and whole line into 'pre' & 'temp' variable respectively
                 # and set the 'is_uinq=1' (assuming might that will be a uniq line)

END{ if(is_uniq) print temp }' infile
    # if there was a line that it's uniq and is the last line of input file, then print it

주석이 없는 동일한 스크립트:

awk -F, 'pre==$1 { print; is_uniq=0; next }
         is_uniq { print temp }
                 { pre=$1; temp=$0; is_uniq=1 }
END{ if(is_uniq) print temp }' infile

노트:이는 입력 파일이 infile첫 번째 필드에서 정렬되어 있다고 가정합니다. 그렇지 않은 경우 정렬된 파일을 다음 필드에 전달해야 합니다.

awk ... <(sort -t, -k1,1 infile)

답변2

csv의 형식이 올바르다고 가정하면(인용 필드 안에 쉼표나 줄바꿈이 없고, 큰따옴표 "( "")가 없는 등) 다음을 사용할 수 있습니다.

awk -F ',' 'NR==FNR{seen1[$1]++;next};seen1[$1]==1||seen2[$1]++
            {print(NR,$0)}' infile infile

파일의 어느 곳에서나 줄이 반복되는지 알 수 있는 유일한 방법은 줄이 반복되는 횟수를 얻는 것입니다. 이것은 으로 이루어집니다 seen1. 그런 다음 줄 개수가 1(중복 없음)이거나 이미 표시된 경우(파일의 두 번째 스캔)(complete 사용 seen2) 인쇄합니다.

파일이정렬됨첫 번째 필드를 통해 @devWeek 솔루션을 사용하세요.

답변3

$ cat file
1,a
2,b
2,c
3,d
3,e
3,f
4,g
4,h
5,i

"2,b", "3,d" 및 "4,g" 행을 삭제하려고 합니다.

perl -F, -anE '
    push $lines{$F[0]}->@*, $_ 
  } END { 
    for $key (sort keys %lines) {
        shift $lines{$key}->@* if (scalar($lines{$key}->@*) > 1); # remove the first
        print join "", $lines{$key}->@*;
    }
' file
1,a
2,c
3,e
3,f
4,h
5,i

관련 정보