반복되는 문자만 포함된 줄을 모두 삭제하는 방법은 무엇입니까?

반복되는 문자만 포함된 줄을 모두 삭제하는 방법은 무엇입니까?

예를 들어:

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

관련 정보