고유한 라인 인쇄

고유한 라인 인쇄

sort및 조합 외에 고유한 줄을 인쇄하는 더 나은 솔루션이 있습니까 uniq?

답변1

모든 동일한 줄만 순서에 관계없이 인쇄하려면 다음을 수행하세요.

sort -u

순서에 상관없이 고유한 줄만 인쇄하려면 다음을 수행하세요.

sort | uniq -u

각 동일한 줄을 처음 발생 순서대로 한 번만 인쇄하려면: (각 줄에 대해 아직 표시되지 않은 경우 줄을 인쇄한 다음 어떤 경우든 표시된 카운터를 증가시킵니다.)

awk '!seen[$0] {print}
     {++seen[$0]}'

처음 발생한 순서대로 고유한 행만 인쇄하려면: (각 행을 에 기록하고 seen, lines첫 번째 발생인 경우에도 기록합니다. 입력이 끝나면 나타나는 순서대로 행을 인쇄하지만 행을 한 번 본 행만 인쇄합니다. )

awk '!seen[$0]++ {lines[i++]=$0}
     END {for (i in lines) if (seen[lines[i]]==1) print lines[i]}'

답변2

일부(대부분?) 버전에는 해당 부분을 직접 실행하는 플래그가 sort있습니다 . 그러나 구현에 따라 일부 줄 길이 제한이 있을 수 있지만 이미 일반 제한이 있습니다 .-uuniqsort|uniq

답변3

답변에 언급된 마지막 부분은 다음과 같습니다.고유한 라인 인쇄@Gilles 이 질문에 대한 답으로 두 개의 해시를 사용할 필요를 없애려고 노력하고 있습니다.

이 솔루션은 작동합니다. 처음 나타나는 순서대로 고유한 줄만 인쇄합니다.

awk '{counter[$0]++} END {for (line in counter) if (counter[line]==1) print line}'

여기서 "카운터"는 이전에 처리된 행과 유사한 각 행의 개수를 저장합니다.
마지막으로 카운터 값이 1인 줄만 인쇄합니다.

답변4

Perl이 당신에게 적합합니까? 중복 항목이 인접하지 않은 경우에도 행의 원래 순서를 유지합니다. Python이나 awk.

while (<>) {
    print if $lines{$_}++ == 0;
}

로 단축될 수 있다

perl -ne 'print unless $lines{$_}++;'

주어진 입력 파일:

abc
def
abc
ghi
abc
def
abc
ghi
jkl

다음과 같은 출력이 생성됩니다.

abc
def
ghi
jkl

관련 정보