How can I print only those lines that appear exactly once in a file? E.g., given this file:
mountain
forest
mountain
eagle
The output would be this, because the line mountain
appears twice:
forest
eagle
- The lines can be sorted, if necessary.
Using awk:
awk '{!seen[$0]++};END{for(i in seen) if(seen[i]==1)print i}' file
eagle
forest
Use sort
and uniq
:
sort inputfile | uniq -u
The -u
option would cause uniq
to print only unique lines. Quoting from man uniq
:
-u, --unique
only print unique lines
For your input, it'd produce:
eagle
forest
Obs: Remember to sort
before uniq -u
because uniq
operates on adjacent lines. So what uniq -u
actually does is to print lines that don't have identical neighbor lines, but that doesn't mean they are really unique. When you sort
, all the identical lines get grouped together and only the lines that are really unique in the file will remain after uniq -u
.
You almost had the answer in your question:
sort filename | uniq -u