【问题标题】:Replace a string in the last 100 records on a file using awk使用 awk 替换文件最后 100 条记录中的字符串
【发布时间】:2014-10-10 12:13:06
【问题描述】:

因此,我使用 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 替换字符串后打印处理过的文本中的字段并打印整个文件,包括已替换的记录

【问题讨论】:

    标签: bash awk gsub


    【解决方案1】:

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

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

    sed

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

    【讨论】:

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

      【讨论】:

      • 这似乎在起作用,但我不知道数字 7 代表什么。附带说明一下,在将字符串替换为全部 400 条记录或最后 100 条记录之后,您将如何继续打印记录 1、3 和 5?感谢您的帮助
      • @ulisesfierro 任何非零数字都将执行默认操作print。您的代码中的问题是:1)gsub() 语法。 2)print不应该在&lt;100{.... print}这样,你只输出最后100行。所以NR&gt;v1-100{gsub(/gold/,"magic")}7NR&gt;v1-100{gsub(/gold/,"magic")}{print}一样
      • 我很确定我仍然做错了什么,但我已经通过 gsub 语法进行了更正,并且打印不在 &lt;100{.... print} 范围内,但我仍然得到整个文件而不是最后一个100 条记录,即使替换仅适用于最后 100 条记录
      • @ulisesfierro 我不明白......说一个文件有 400 行。你想得到什么?只有完成替换工作的最后 100 行?还是 400 行,最后 100 行被替换?
      • 只有完成替换的最后 100 行,我才能找出您的第二个选项。
      猜你喜欢
      • 1970-01-01
      • 2016-04-13
      • 1970-01-01
      • 2014-04-06
      • 1970-01-01
      • 2015-01-13
      • 2017-02-08
      • 1970-01-01
      • 2011-05-15
      相关资源
      最近更新 更多