다음과 같은 파일이 있습니다
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 스크립트 헤더에 추가 플래그 지정