2013-02-28 18 views
20
onefish 
onechicken 
twofish 
twochicken 
twocows 
threechicken 

Cosa succede se voglio grep per le righe contenenti "due", ma voglio solo la seconda corrispondenza. Quindi voglio il risultato "twochicken".Visualizza solo la n'a partita di grep

risposta

23

provare questo:

awk '/two/{i++}i==2' file 

con i tuoi dati:

kent$ echo "onefish 
onechicken 
twofish 
twochicken 
twocows 
threechicken"|awk '/two/{i++}i==2' 
twochicken 

nota: se il file è enorme, fare questo:

awk '/two/{i++}i==2{print; exit}' file 
+0

la seconda opzione è superiore indipendentemente dalla dimensione del file, no? – poncha

+0

@poncha, numero di riga – Kent

+0

cosa intendi per 'numero di riga'? intendevo aggiungere "{print; exit} 'sarebbe una buona idea per qualsiasi dimensione di input ... oh. quella era l'opzione n. 3 in realtà;) Ho contato male))) – poncha

17
grep -m2 "two" in-file.txt | tail -n1 

Fermarsi dopo la seconda partita, quindi stampare la seconda riga.

+1

che non fa esattamente ciò che ci si aspetta. se ci sono più corrispondenze di due, produrrà più righe ... – poncha

+0

La coda dovrebbe essere: 'tail -n1'. – Thor

+0

@poncha: davvero? Il grep -m2 si accerta che ci siano solo due partite. L'ho cambiato comunque, anche se penso che fosse OK prima. –

0

Se la parola (qui parola == due) si ripete più volte in una singola riga, & si desidera stampare t tale linea, utilizzare di seguito:

word=two 
n=2 
line=`grep -m$n $word -o -n MyFile | sed -n $n's/:.*//p'` 
awk 'FNR=='$line'{print; exit}' MyFile 

ad es. Per sotto di ingresso:

onefish 
onechicken 
twotwofish 
twochicken 
twocows 
threechicken 

verrà stampata twotwofish, invece di twochicken.

Questo potrebbe non essere quello che vuole user1787038, ma aggiunto per rispondere al mio commento.

+0

'-m $ n' nella riga di grep è solo per qualche ottimizzazione, non necessaria per la funzionalità. – anishsane

1

Va osservato che se le threechicken e twocows linee sono stati scambiati, alias:

onefish 
onechicken 
twofish 
twochicken 
threechicken 
twocows 

quindi prima risposta di Kent (awk '/two/{i++}i==2' file) produrrebbe l'output:

twochicken 
threechicken 

perché prende un'altra occorrenza dell'incontro per incrementare il contatore. La sua ultima risposta: awk '/two/{i++}i==2{print; exit}' file evita questo problema.

Problemi correlati