2013-02-28 2 views

Antwort

23

versuchen Sie dies:

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

mit Ihren Daten:

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

note: wenn die Datei sehr groß ist, dies zu tun:

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

die zweite Option ist überlegen, unabhängig von der Dateigröße, nein? – poncha

+0

@ponacha, Zeilennummer – Kent

+0

was meinst du mit 'Zeilennummer'? Ich meinte damit, '{print; Ausgang} 'wäre eine gute Idee für jede Eingangsgröße ... oh. das war Option # 3 eigentlich;) Ich zählte falsch))) – poncha

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

Stoppen Sie nach der zweiten Übereinstimmung, dann nehmen Sie die zweite gedruckte Zeile.

+1

das nicht genau das tut, was erwartet wird. Wenn es mehr Übereinstimmungen als zwei gibt, wird es mehrere Zeilen ausgeben ... – poncha

+0

Der Schwanz sollte sein: 'tail -n1'. – Thor

+0

@ponacha: wirklich? Das grep -m2 stellt sicher, dass es nur zwei Übereinstimmungen gibt. Ich habe es trotzdem geändert, obwohl ich denke, dass es früher OK war. –

0

Wenn das Wort (hier word == zwei) wiederholt mehrere Zeit in einer einzigen Zeile, & Sie wollen prin t dieser Linie, verwenden unter:

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

z.B. Für unter Eingabe:

onefish 
onechicken 
twotwofish 
twochicken 
twocows 
threechicken 

wird es twotwofish drucken, statt twochicken.

Dies ist möglicherweise nicht das, was user1787038 will, aber hinzugefügt, um meinen eigenen Kommentar zu beantworten.

+0

'-m $ n' in der Grep-Zeile dient nur der Optimierung, nicht für die Funktionalität. – anishsane

1

Es sollte beachtet werden, dass, wenn die threechicken und twocows Linien getauscht wurden, auch bekannt als:

onefish 
onechicken 
twofish 
twochicken 
threechicken 
twocows 

dann Kents erste Antwort (awk '/two/{i++}i==2' file) die Ausgabe ergeben würde:

twochicken 
threechicken 

, weil es ein anderer nimmt Auftreten der Übereinstimmung, um den Zähler zu erhöhen. Seine letzte Antwort: awk '/two/{i++}i==2{print; exit}' file vermeidet dieses Problem.

Verwandte Themen