여러 번 나타나지만 한 번만 값을 인쇄하는 명령


8

값이 여러 번 반복되는 큰 txt 파일이 있습니다. 파일을 통과 할 수있는 명령이 있습니까? 한 값이 한 번 나타나면 다시 반복하지 않습니까?

SO4
HOH
CL
BME
HOH
SO4
HOH
CL
BME
HOH
SO4
HOH
SO4
HOH
CL
BME
HOH
SO4
HOH
CL
BME
HOH
CL

따라서 다음과 같이 보일 것입니다 :

S04   
HOH  
CL   
BME 

문제는 수많은 다른 값을 가지고 있기 때문에 여기처럼 수동으로 할 수는 없다는 것입니다.

답변:


11

sort다음 옵션과 함께 명령 을 사용할 수 있습니다 --unique.

sort -u input-file

표준 출력 대신 FILE에 결과를 쓰려면 다음 옵션을 사용하십시오 --output=FILE.

sort -u input-file -o output-file

명령 uniq을 적용 할 수도 있습니다. 이 경우 동일한 줄이 결과적이어야하므로 입력에 대한 사전 정렬 필요합니다. 메모에 대한 @RonJohn 덕분에 다음같습니다 .

sort input-file | uniq > output-file

sort비슷한 이유로 인해 비슷한 경우에 대한 명령이 마음에 들지만 큰 배열로 작업하는 경우 awkJohn1024의 답변에 의한 접근 방식 이 더 강력 할 수 있습니다. 다음은 거의 5 백만 줄의 파일 (위의 예를 기반으로)에 적용 된 언급 된 접근법 간의 시간 비교입니다.

$ cat input-file | wc -l
20000000

$ TIMEFORMAT=%R
$ time sort -u input-file | wc -l
64
7.495

$ time sort input-file | uniq | wc -l
64
7.703

$ time awk '!a[$0]++' input-file | wc -l      # from John1024's answer
64
1.271

$ time datamash rmdup 1 < input-file | wc -l  # from αғsнιη's answer
64
0.770

다른 중요한 차이점은 @Ruslan 언급 한 것입니다 .

sort -uawk명령은 입력이 종료 된 후에 만 ​​결과를 인쇄하지만이 명령은 새로운 각 결과 행을 즉시 인쇄합니다 (파일보다 파이프 입력의 경우 더 중요 할 수 있음).

그림은 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

위의 예에서 루프 (아래에 표시됨)는 각각 길이가 3자인 문자 AD의 500 개의 임의 조합을 생성합니다. 이 조합은 awk또는 로 파이프됩니다 sort.

for i in {1..500}; do cat /dev/urandom | tr -dc A-D | head -c 3; echo; done

1
매우 간단한 명령입니다! 많은 감사합니다! 모두 제일 좋다.
djordje

2
아, 하나의 유틸리티가 한 가지 일을하고 잘했던 날! sort input-file | uniq!!!!
RonJohn

15

출력 라인을 입력 라인과 동일한 순서로 유지하려면 다음을 사용하십시오.

$ awk '!a[$0]++' file
SO4
HOH
CL
BME

작동 방식 :

이것은 연관 배열 a을 사용 하여 각 줄이 이전에 본 횟수를 계산합니다. 이전에 보이지 않았 으면 라인이 인쇄됩니다.


2
는 매우 까다 롭지 awksort -u쉬운 방법입니다.
Pierre François

4
@ PierreFrançois뿐만 sort -u아니라 가장 느린 방법입니다. :) 두 가지 방법 사이의 시간 비교로 답변을 업데이트했습니다.
pa4080

4
또한 sort -u입력이 종료 된 후에 만 ​​결과를 인쇄하는 반면이 awk명령은 새로운 결과 행을 즉시 인쇄합니다 (파일보다 파이프 입력에 더 중요 할 수 있음).
Ruslan

이 쪽지 @Ruslan에 감사드립니다! 나는 그것을 대답으로 설명하려고 노력했다.
pa4080

awk솔루션은 읽기 쉽지는 않지만 매우 좋은 솔루션 이라고 고백해야합니다 sort.
Pierre François

1

다음과 같이 GNU를 datamash 여기에서도 사용할 수 있으며 라인 순서를 유지합니다.

datamash rmdup 1 < infile

1
time 비교 에 따르면 여기에 제공된 가장 빠른 솔루션입니다.
pa4080
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.