Linux에서 고유한 줄을 인쇄하도록 도와주세요. 단어의 예는 다음과 같습니다.
A B
B C
C D
A E
F G
H I
I J
출력은
F G
H I
즉, 위의 예에서와 같이 줄은 먼저 고유해야 하며 줄의 단어도 한 번만 나타나야 합니다. "FG"는 유일한 줄이고 "F" 또는 "G"는 다른 줄에 나타나지 않습니다. "안녕하세요".
답변1
고유한 단어 목록을 얻을 수 있습니다. 그러면 일치하는 줄은 모든 단어가 고유한 줄이 됩니다.
tr -cs 'A-Z' '[\n*]' < words.txt |
sort |
uniq -u |
perl -lne '
if ($ARGV eq "-") {
$u{$_}=1;
next
}
for $w (/[A-Z]+/g) {
next LINE unless $u{$w}
}
print' - words.txt
A-Z
단어를 구성하는 문자 목록으로 변경합니다 .
답변2
awk로 이 작업을 수행할 수 있습니다.
고유.awk
FNR == NR {
for(i=1; i<=NF; i++)
if(++w[$i] > 1)
not_unique[$i] = 1
next
}
{
for(i=1; i<=NF; i++)
if(not_unique[$i])
next
}
1
다음과 같이 실행하세요:
awk -f unique.awk infile infile
산출:
F G
한 줄로:
awk 'FNR == NR { for(i=1; i<=NF; i++) if(++w[$i] > 1) not_unique[$i] = 1; next } { for(i=1; i<=NF; i++) if(not_unique[$i]) next } 1' infile infile
설명하다
파일을 두 번 구문 분석해야 합니다. 먼저 고유하지 않은 단어를 모두 찾은 다음 고유 단어가 포함된 줄만 인쇄해야 합니다. 이는 프로그램 구조에 반영됩니다. 첫 번째 블록은 고유하지 않은 단어를 포함하는 해시를 생성하고, 두 번째 블록은 각 줄을 확인하고 고유하지 않은 단어가 있으면 건너뜁니다. 1
후행 끝에는 고유한 줄이 발생하고 awk의 기본 작업( )이 호출되는 경우에만 도달합니다 { print $0 }
.