Как печатать только уникальные строки в BASH?

Как я могу напечатать только те строки, которые появляются ровно один раз в файле? Например, данный файл:

mountain
forest
mountain
eagle

Выход будет таким, потому что строка mountain появляется дважды:

forest
eagle
  • Строки можно сортировать, если необходимо.

Ответ 1

Использование awk:

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

Ответ 2

Используйте sort и uniq:

sort inputfile | uniq -u

Опция -u заставит uniq печатать только уникальные строки. Цитата из man uniq:

   -u, --unique
          only print unique lines

Для вашего ввода, он будет производить:

eagle
forest

Obs: Не забудьте sort перед uniq -u потому что uniq работает на соседних строках. Так что uniq -u самом деле делает, чтобы печатать строки, которые не имеют идентичных соседних линий, но это не значит, что они действительно уникальны. Когда вы sort, все идентичные строки группируются вместе, и после uniq -u останутся только те строки, которые действительно уникальны в файле.

Ответ 3

У вас почти был ответ на ваш вопрос:

sort filename | uniq -u