所以我开始处理使用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替换字符串后打印已处理文本的字段并打印整个文件,包括已替换的记录
答案 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'