たとえば、
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行に分割します。文字を繰り返すと、ループは2行目に移動します。最後の最初の行が空でない場合は、レコードを印刷します。
答え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つの出口を提供します。
- まず、このプロセス中に文字列全体が空になり、トークンだけが残っている場合は、文字列にすべての重複エントリが含まれていることがわかり、終了します。
- 2. このプロセスで文字列の最初の要素が繰り返されないことがわかった場合。重複していない場所が 1 つ以上あることを意味します。したがって、この行を印刷する必要があります。プロセスを開始する前に、保管場所に保管されている原稿を削除してください。
- 別の方法は、最初の要素が文字列のどこかに少なくとも1つの重複項目を持ち、文字列
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