2015-04-22 2 views
3

Я хотел бы переписать последнее поле (всего 2 поля) последней строки файла со значением -9. Я использую эту команду:Заменить последнее поле в последней строке с помощью awk

awk 'END{$2=-9}1' file.txt > new_file.txt 

, но он не работает (замена не производится). Почему это? Есть идеи?

Спасибо!

+0

Условие блока END обрабатывается после последней строки последнего входного файла. $ 0, $ 1, $ 2, ... пуст в вашем блоке END, вы можете проверить его, напечатав $ 0 и $ 1, $ 2. –

+0

Если ваш файл большой и несжатый, тогда вы должны рассмотреть утилиту unix ['dd'] (http://en.wikipedia.org/wiki/Dd_%28Unix%29). –

ответ

4

Вам нужно распечатать предыдущую линию, а затем вы можете управлять последней строки в конце блока, прежде чем он уже напечатал:

awk 'NR > 1 {print prev} {prev = $0} END {$2=-9; print}' 
+0

Вы забыли '' файл'' xP – klashxx

+0

Идентичный ответ Эд! Благодаря!!! – Yorgos

3

секция END выполняется ПОСЛЕ обрабатывая последнюю строку, чтобы присвоить значение $2 значение после печати последней строки.

Также нет гарантии, что в разделе END будут сохраняться $ 2 или $ 0 или любое из полей (POSIX не указывает его), но IF в вашем awk, $ 2 и т. Д. Сохраняется, тогда вам нужно что-то вроде :

awk ' 
NR>1{print prev} 
{prev=$0} 
END {$2=-9; print} 
' 

Если они не то вам нужно создать $ 0 первый:

awk ' 
NR>1{print prev} 
{prev=$0} 
END {$0=prev; $2=-9; print} 
' 
+1

Спасибо, это сработало! – Yorgos

2

Другой способ использования tac + awk:

tac file.txt|awk 'NR==1{$NF="-9";}1'|tac >new_file.txt 

PS: Я предпочитаю решение @glenn.