2015-04-22 82 views
3

我想用值-9覆盖文件最后一行的最后一个字段(总共2个字段)。我正在使用这个命令:使用awk覆盖最后一行中的最后一个字段

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

但它似乎没有工作(没有替换完成)。为什么?有任何想法吗?

谢谢!

+0

END块条件在最后一个输入文件的最后一行之后进行处理。在END块中$ 0,$ 1,$ 2,...为空,您可以通过打印$ 0或$ 1,$ 2来测试它。 –

+0

如果你的文件很大并且未压缩,那么你应该考虑unix工具['dd'](http://en.wikipedia.org/wiki/Dd_%28Unix%29)。 –

回答

4

你需要打印以前行,然后你可以操纵在END块中的最后线已经付印前:

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

你忘了''file'' xP – klashxx

+0

Ed的答案完全相同!谢谢!!! – Yorgos

3

节末时后执行处理最后一行,以便在最后一行打印完成后分配$2值。

也不能保证$ 2或$ 0或任何字段将被保留在END部分(POSIX没有指定它),但是如果你的awk,$ 2等中的IF被保存,那么你需要的是类似:

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解决方案。

相关问题