web-dev-qa-db-ja.com

BASHで一意の行のみを印刷する方法は?

ファイルに1回だけ現れる行だけを印刷するにはどうすればよいですか?たとえば、次のファイルがあるとします。

mountain
forest
mountain
eagle

mountainという行が2回表示されるため、出力は次のようになります。

forest
eagle
  • 必要に応じて、行を並べ替えることができます。
18
Village

Awkの使用:

awk '{!seen[$0]++};END{for(i in seen) if(seen[i]==1)print i}' file
eagle
forest
12
anubhava

sortuniqを使用:

_sort inputfile | uniq -u
_

_-u_オプションを使用すると、uniqは一意の行のみを出力します。 _man uniq_からの引用:

_   -u, --unique
          only print unique lines
_

あなたの入力のために、それは生成します:

_eagle
forest
_

Obs: _uniq -u_の前にsortを忘れないでください。uniq隣接行で動作するためです。したがって、_uniq -u_が実際に行うことは、同一の隣接線を持たない線を出力することですが、それは実際にそれらが一意であることを意味しません。 sortを実行すると、すべての同一行がグループ化され、ファイル内で本当に一意の行のみが_uniq -u_の後に残ります。

44
devnull

あなたはほとんどあなたの質問に答えを持っていました:

sort filename | uniq -u

7
Oliver Matthews