ユニークなライン印刷

ユニークなライン印刷

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 この質問に対する答えとして、2つのハッシュを使用する必要をなくそうと努力しています。

このソリューションは動作します。最初に表示される順序で一意の行のみを印刷します。

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

関連情報