2013-02-28 12 views

Odpowiedz

23

spróbuj tego:

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

z danymi:

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

nocie: jeśli plik jest ogromny, to zrobić:

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

druga opcja jest lepsza, niezależnie od rozmiaru pliku, nie? – poncha

+0

@poncha, numer linii – Kent

+0

co masz na myśli przez "numer linii"? Miałem na myśli, że dodanie '{print; exit} 'byłoby dobrym pomysłem dla każdego rozmiaru wejściowego ... oh. to była właściwie opcja # 3;) źle policzyłem))) – poncha

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

Zatrzymaj się po drugim dopasowaniu, a następnie wydrukuj drugą linię.

+1

to nie robi dokładnie tego, co jest oczekiwane. jeśli jest więcej dopasowań niż dwa, wyświetli wiele linii ... – poncha

+0

Ogon powinien brzmieć: 'tail -n1'. – Thor

+0

@poncha: naprawdę? Grep -m2 zapewnia, że ​​są tylko dwa dopasowania. Mimo wszystko zmieniłem to, choć wydaje mi się, że było OK. –

0

Jeśli słowo (tutaj słowo == dwa) powtarza wiele razy w jednym wierszu, & chcesz wydrukować t tej linii, użyj poniżej:

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

np. Dla poniżej wejścia:

onefish 
onechicken 
twotwofish 
twochicken 
twocows 
threechicken 

zostanie wydrukowana twotwofish zamiast twochicken.

To może nie być to, czego chce użytkownik1787038, ale dodane, aby odpowiedzieć na mój komentarz.

+0

'-m $ n' w linii grep jest tylko dla pewnej optymalizacji, nie jest potrzebne do funkcjonalności. – anishsane

1

Należy zauważyć, że jeśli threechicken i twocows linie zostały zamienione aka:

onefish 
onechicken 
twofish 
twochicken 
threechicken 
twocows 

czym pierwsza reakcja Kent (awk '/two/{i++}i==2' file) dawałoby wyjściowe:

twochicken 
threechicken 

ponieważ bierze udział wystąpienie meczu, aby zwiększyć licznik. Jego ostatnia odpowiedź: awk '/two/{i++}i==2{print; exit}' file pozwala uniknąć tego problemu.

Powiązane problemy