중복 항목을 기준으로 열을 정렬하고 첫 번째 항목 유지 [중복]

중복 항목을 기준으로 열을 정렬하고 첫 번째 항목 유지 [중복]

다음과 같은 파일이 있습니다

1:A
2:B
3:A

내가 필요한 출력은 다음과 같습니다

1:A
2:B

세 번째 항목의 두 번째 열에는 첫 번째 항목과 마찬가지로 A가 포함되어 있으므로 삭제합니다. 또한 대소문자를 구분해야 합니다.

용량이 매우 큰 파일이므로 시간을 절약해 보시면 좋을 것 같습니다.

이것을 시도해 보았으나 고유한 줄만 인쇄되는 것 같습니다.

sort -u -t':' -k3,3 file

답변1

사용sort

Ed가 그의 책에서 말했듯이논평, sort명령은 세 번째 필드를 정렬하고 있지만 실제로는 두 개의 필드( :필드 구분 기호)만 있습니다. 따라서 문제를 해결하려면 키를 3.2

그러나 레코드가 행/레코드 번호 대신 키 값을 기준으로 정렬되면 소스 파일의 원래 레코드 순서가 엉망이 됩니다.

$ sort -u -t':' -k2,2 test.txt 
1:A
2:B
6:C
5:a
4:b
$

이것은 아마도아니요당신은 무엇을 원합니까? 그러나 이 문제는 출력을 다시 파이핑하여 쉽게 해결할 수 있습니다 sort.

$ sort -u -t':' -k2,2 test.txt | sort 
1:A
2:B
4:b
5:a
6:C
$

노트--parallel: 큰 파일이 있다고 말씀하셨듯이 속도를 높이려면 플래그 1을 사용하는 것이 좋습니다 .

sort --parallel=<n> -u -t':' -k2,2 test.txt | sort --parallel=<n>

<n>사용 가능한 코어 수는 언제 확보됩니까 ?

사용awk

예제 파일을 확장하면 원본 데이터가 다음과 같은 이름의 파일에 있는 경우 test.txt:

1:A
2:B
3:A
4:b
5:a
6:C

그리고 다시 필드 구분 기호로 간주되므로 2 를: 사용할 수 있습니다 .awk

예를 들어 다음 줄은 다음과 같습니다.

awk 'BEGIN{FS=":"}{if (!seen[$2]++)print $0}' test.txt

다음과 같은 결과를 제공합니다.

$ awk 'BEGIN{FS=":"}{if (!seen[$2]++)print $0}' test.txt 
1:A
2:B
4:b
5:a
6:C
$

다음을 사용하여 논리를 살펴보면 이것이 어떻게 작동하는지 이해할 수 있습니다.

$ awk 'BEGIN{FS=":"}{print !seen[$2]++}' test.txt 
1
1
0
1
1
1
$
  • 먼저 필드 구분 기호는 로 지정됩니다 FS=":".
  • 둘째, 부정 연산자는 두 번째 필드 항목에 대해 "true" 결과를 제공합니다.하지만보였다.
  • 마지막으로 print $0전체 레코드, 즉 현재 행이 인쇄됩니다.

이것을 스크립트 대신 쉘 스크립트 3 에 넣으면 다음 이 제공됩니다.awk

#!/bin/sh

awk -F':' '
  (!seen[$2]++) {
    print $0
  }
' "$1"

인용하다:

1답변도착하다대용량 파일을 정렬하는 방법은 무엇입니까?

2답변도착하다세 열 중 두 열의 정보를 기반으로 고유한 행을 유지합니다.

3답변도착하다awk 스크립트 헤더에 추가 플래그 지정

관련 정보