使用awk替换文件的最后100条记录中的字符串

时间:2014-10-10 12:13:06

标签: bash awk gsub

所以我开始处理使用wc -l声明变量的文件的最后100条记录,但是我很难让awk的子部分做我想做的事。

下面的文字只是一个例子,但它确实帮助我了解了整个表格

gold     1    1986  USA                 American Eagle
gold     1    1908  Austria-Hungary     Franz Josef 100 Korona
silver  10    1981  USA                 ingot
gold     1    1984  Switzerland         ingot
gold     1    1979  RSA                 Krugerrand
gold     0.5  1981  RSA                 Krugerrand
gold     0.1  1986  PRC                 Panda
silver   1    1986  USA                 Liberty dollar
gold     0.25 1986  USA                 Liberty 5-dollar piece

让我们称这个文件为硬币并假设有超过400条记录

awk -v v1=$(wc -l < coins) 'NR > v1-100 {gsub /gold/magic/; print}' coins

它对我来说真的不起作用,如果我想要打印第一个字段,它会起作用,但我似乎无法指定记录的数量然后处理它们。我想知道如何继续更换字符串,如果需要,在用awk替换字符串后打印已处理文本的字段并打印整个文件,包括已替换的记录

2 个答案:

答案 0 :(得分:3)

如果你有tac,你可以这样做:

tac coins | awk 'NR<=100{gsub(/gold/,"magic")}1' | tac

sed

tac coins | sed '1,100s/gold/magic/' | tac

答案 1 :(得分:2)

尝试一下:

awk -v v1="$(wc -l < coins)" 'NR>(v1-100){gsub(/gold/,"magic")}7' coins

这将输出400行(比如你的文件有400行),但替换是在最后100行完成的。

或通过使用awk读取文件两次获取行号:

awk 'NR==FNR{num=NR;next}FNR>(num-100){gsub(/gold/,"magic")}7' coins coins

修改

op只想要输出中的最后100行:

awk 'NR==FNR{num=NR;next}FNR>(num-100){gsub(/gold/,"magic");print}' coins coins

或者您可以使用tail

tail -100 coins|awk 'gsub(/gold/,"magic")+7'