텍스트 파일에서 고유 문자열을 제거하는 방법은 무엇입니까?

텍스트 파일에서 고유 문자열을 제거하는 방법은 무엇입니까?

죄송합니다. 쿼리를 올바르게 표현하지 않았기 때문에 예시를 수정해야 했습니다. .txt 파일이 있다고 가정해 보겠습니다.

Happy sad
Happy sad
Happy sad
Sad happy
Happy sad
Happy sad
Mad sad
Mad happy
Mad happy

고유한 문자열을 제거하고 싶습니다. 파일을 남겨두세요:

Happy sad
Happy sad
Happy sad
Happy sad
Happy sad
Mad happy
Mad happy

나는 정렬이 중복( )을 제거할 수 있다는 것을 알고 있습니다 sort file.txt | uniq. 그러면 bash에서 그 반대를 수행하기 위해 명령을 사용할 수 있습니까? 아니면 while 루프를 알아내야 합니까? 그런데 uniq -D file.txt > output.txt작동하지 않습니다.

답변1

사용 awk:

$ awk 'seen[$0]++; seen[$0] == 2' file
Happy sad
Happy sad
Happy sad
Happy sad
Happy sad
Mad happy
Mad happy

이는 각 줄의 텍스트를 연관 배열의 키로 사용합니다 seen. 첫 번째는 seen[$0]++이전에 본 행이 인쇄되도록 합니다. 왜냐하면 해당 행과 연관된 값은 두 번째 및 그 이후 행이 표시될 때 0이 아니기 때문입니다. seen[$0] == 2해당 줄이 두 번째로 표시되는 경우 해당 줄이 다시 인쇄됩니다(그렇지 않으면 반복되는 각 줄의 한 항목을 놓칠 수 있습니다).

awk '!seen[$0]++'가끔 쓰이는거랑 비슷해요 제거하다정렬하지 않고 반복합니다(예:awk '!a[$0]++'는 어떻게 작동하나요?).


중복 행의 복사본을 하나만 가져옵니다.

awk 'seen[$0]++ == 1' file

또는,

sort file | uniq -d

답변2

중복 항목이 연속적이지 않고 입력 순서를 유지해야 하는 경우 awk두 개의 패스를 사용하여 이 작업을 수행할 수 있습니다. 하나는 발생 횟수를 계산하고 다른 하나는 첫 번째 패스에서 여러 번 나타나는 줄을 인쇄하는 것입니다.

awk 'second_pass {if (c[$0] > 1) print; next}
     {c[$0]++}' file.txt second_pass=1 file.txt

답변3

에서 man uniq:

-디 모든 중복 라인 인쇄

다음과 같이 목표를 달성할 수 있습니다.

uniq -D file.txt

답변4

uniq이는 ' 옵션을 사용하므로 Linux 전용 솔루션일 수 있습니다 -u. 다른 버전을 실행하는 경우 uniq -c필터링 등을 사용하여 이 문제를 해결할 수 있습니다.^ *1

sort < in | uniq --unique | grep --invert-match --line-regexp --fixed-strings --file - in

처음 2단계가 시작됩니다.

Mad sad
Sad happy

다음 단계에서는 이러한 행과 정확히 일치하는 행을 삭제합니다. 나는 명확성을 위해 더 긴 옵션을 선택했습니다. 나는 거의 사용하지 않으며 짧은 형식은 다음과 같습니다.sort < in | uniq -u | grep -v -x -F -f - in

관련 정보