2012-05-23 1 views
0

Мне нужно распечатать определенную запись, которая является 3d из хвоста, то есть NR == total NR-2. Я пытался сделать это в течение почти часа, и до сих пор не может получить его работу, так это то, что у меня есть:Как напечатать конкретный NR с awk

cat myfile | grep mystring | awk 'END {NR == $(NR-2); print $0}' 

Это дает мне последний NR, почему?

ответ

2

awk процессов каждой строке и просто выкидывает ее, когда это делается, вам нужно сохранить ее вручную [NB Ваш NR == $(NR-2) проверяет, равно ли число строк (число строк - 2) -го поля в последней строке]. Самое простое было бы хранить их все, но это не очень эффективно, поэтому мы можем хранить только последние три, которые мы видели. На самом деле самый простой будет использовать head и tail:

grep mystring myfile | tail -n3 | head -n1 

Или с awk:

awk '/mystring/{three = two; two = one; one = $0} END{print three}' myfile 
+0

хвост тоже хороший! –

+0

спасибо, как это возможно? Я имею в виду, три переменные? – minerals

+0

@ user1413424 Да, 'три',' two' и 'one' являются переменными. В awk любое голое слово является переменной. ('$ x' указывает позиционную переменную, то есть поле' x'th и 'x' могут быть даже переменной!) – Kevin

0

Есть 2 возможности.

вы можете использовать команду tac (вместо кошки), чтобы полностью изменить файл (от хвоста к голове) и печати 3-го

или использовать буфер, чтобы поместить в памяти последние х приводят

+2

'rev' меняет символы в строке, вы ищете' tac'. – Kevin

+0

спасибо, это интересно – minerals

+0

О да, спасибо @ Кевин! –