2014-05-19 11 views
10

Come posso stampare solo quelle righe che appaiono esattamente una volta in un file? Per esempio, dato questo file:Come stampare solo le linee univoche in BASH?

mountain 
forest 
mountain 
eagle 

Il risultato sarebbe questo, perché la linea mountain appare due volte:

forest 
eagle 
  • Le linee possono essere ordinati, se necessario.
+0

Penso che si possa utilizzare il dizionario . Puoi dare un'occhiata a questo link: http://stackoverflow.com/questions/1494178/how-to-define-hash-tables-in-bash –

risposta

8

Utilizzando awk:

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

Non c'è bisogno di andare così complicato. anche il semplice comando 'uniq' farà il lavoro. – Rahul

+0

1. Non è complesso e 2. Evita costose 'sort' per file di dimensioni maggiori. – anubhava

+0

@anubhava Bello awk. +1. Ma per questo è molto più semplice usare 'uniq'. E mantenendo nella memoria file più grandi - chissà - cosa è più costoso. Scambiare o ordinare. :) – jm666

26

Usa sort e uniq:

sort inputfile | uniq -u 

L'opzione -u causerebbe uniq per stampare soltanto le righe univoche. Citando man uniq:

-u, --unique 
      only print unique lines 

Per il vostro ingresso, sarebbe produrre:

eagle 
forest 
+0

@jordan Non so. A qualcuno non è piaciuto, forse. – devnull

+1

@anubhava Lo hai provato? – devnull

+0

Mi scuso "-u' in copia/incolla. – anubhava

3

È quasi avuto la risposta nella tua domanda:

sort filename | uniq -u

Problemi correlati