예를 들어:
22111155
44788
56667775
aannmmmm88
66h1122
PPDd88
출력은 다음과 같아야 합니다.
44788 # 7 is not repeated
66h1122 # letter h is not repeated
PPDd88 # letters D or d are not repeated
같은 줄에서 문자가 두 번 이상 반복되는 모든 줄을 제거합니다.
같은 줄에 반복되지 않는 문자가 있으면 해당 줄만 인쇄됩니다.
답변1
그리고 perl
:
perl -ne 'my %count;
$count{$_}++ for /./g;
print if grep {$_ == 1} values %count'
그리고 sed
:
sed '
/./!d;h;s/$/\
/
:1
s/\(.\)\(.*\)\1\(.*\n\)/\2\3\1/
s/\(.\)\1*\(.*\n.*\1\)/\2/
t1
/^\n/d;g'
패턴 공간을 두 줄로 나눕니다. 문자를 반복하면 루프가 두 번째 줄로 이동됩니다. 마지막 첫 번째 줄이 비어 있지 않으면 레코드를 인쇄합니다.
답변2
sed -e '
/\n/!{h;s/^/\n/;}
/^\n$/d
/^\n\(.\).*\1/!{g;b;}
:b;s/^\(\n\(.\).*\)\2/\1/;tb
s/\n./\n/;s/^/\n/;D
'
설명하다:
- 패턴의 시작 부분에 마커를 배치하면
\n
프로세스에서 오른쪽으로 이동합니다. - 우리는 무한 루프를 설정하고 루프 내에 두 개의 출구를 제공합니다.
- 첫째, 이 프로세스 중에 전체 문자열이 비워지고 토큰만 남으면 문자열에 모든 중복 항목이 포함되어 있음을 알고 종료됩니다.
- 2. 이 과정에서 문자열의 첫 번째 요소가 반복되지 않는 것을 발견한 경우. 중복되지 않은 위치가 하나 이상 있음을 의미합니다. 따라서 이 줄을 인쇄해야 합니다. 프로세스를 시작하기 전에 보관 장소에 보관된 원본을 제거합니다.
- 또 다른 방법은 첫 번째 요소가 문자열 어딘가에 적어도 하나의 중복 항목을 갖고
t-loop
문자열에서 해당 요소의 존재를 완전히 제거하는 것입니다.
또 다른 방법은 다음과 같이 사용하는 것입니다 Perl
.
perl -lne '
my $s = $_;
s/\Q$1\E//g while $s =~ /(.)(?=.*?\1)/g;
print $s if /./;
'
여기서는 행을 복제하고 중복된 요소를 계속 찾고 원래 행에서 계속 제거합니다. while 루프가 끝난 후 일부 내용이 행에 남아 있으면 복사본을 인쇄합니다(반복되지 않는 내용이 남아 있음을 의미).
답변3
perl one-liner: 모든 문자 쌍을 제거하고 남은 문자가 있으면 해당 줄을 인쇄합니다.
perl -lne '($copy = $_) =~ s/(.)\1//g; print if $copy' file
당신이 말했듯이 위의 내용은 잘못되었습니다. 해당 답변은 보기에만 해당되므로 "56667775"가 잘못 인쇄됩니다.오른쪽성격. Stéphane의 답변이 올바른지 확인하세요.
답변4
상황에 맞게 솔루션을 조정하세요.최근 질문:
awk '
{split ("", N) # delete N array
L = 0 # reset boolean L used for print decision
for (i=1; i<=length; i++) N[substr($0, i, 1)]++ # calculate count of characters
for (n in N) if (N[n] < 2) {L = 1 # for non-duplicate chars: set print decision
break # and quit the for loop
}
}
L # print if non-duplicate chars exist
' file
44788
66h1122
PPDd88