awk를 사용하여 47필드 csv 파일의 1~46열에서 중복 항목을 제거하는 방법은 무엇입니까?

awk를 사용하여 47필드 csv 파일의 1~46열에서 중복 항목을 제거하는 방법은 무엇입니까?

많은 파일을 csv 파일로 병합하는 bash 스크립트가 있습니다. csv 파일에는 47개의 필드와 10000개의 행이 있습니다.

그러나 내가 사용한 중복 항목을 제거하기 위해 awk '!seen[$0]++'정렬 목적으로 47열에 원본 소스에 대한 참조를 추가했습니다.

여전히 1열부터 46열까지만 색인을 생성하고 모든 열(47열 포함)을 인쇄하고 싶습니다.

46개를 모두 나열해야 합니까 awk '!seen[$1, $2, $3, ,..etc.., $45, $46]++, 아니면 더 쉬운 방법이 있습니까?

답변1

'sort_field=$47; $47=""; !seen[$0]++ { print $0 " " sort_field }' 

답변2

1~46 필드 sort의 uniqe 옵션에 따라 고유한 행을 사용하고 인쇄합니까?-uk1,46

sort -uk1,46 infile.txt

입력 파일이 .csv에서 쉼표로 구분된 경우 .csv를 사용하여 지정할 수 있습니다 -t','.

sort -t',' -uk1,46 infile.txt

예를 들어 다음 입력의 경우:

1,2,3,4
5,6,7,8
1,2,3,x
a,b,c,d
5,6,7,y

출력은 다음과 같습니다

1,2,3,4
5,6,7,8
a,b,c,d

답변3

이 시도:

$ cat file
1 2 3 4
5 6 7 8
1 2 3 x
a b c d
5 6 7 y

처음 3개 필드를 "키"로 처리하고 두 번째 "1 2 3" 및 두 번째 "5 6 7" 행을 삭제하려고 합니다.

awk '
    {
        line = $0     # remember the original state of this line
        NF--          # forget about the last field
    }
    !seen[$0]++ {print line}   # if the "new" line is unique, print the "old" line
' file
1 2 3 4
5 6 7 8
a b c d

관련 정보