【问题标题】:awk: find and replace in certain field only [closed]awk:仅在某些字段中查找和替换[关闭]
【发布时间】:2012-12-27 12:33:45
【问题描述】:

我有一个这样的文本文件:

$ cat test
12 13 2100 s
12 13 3100 s
100 13 100 s
12 13 300 s

我希望输出是这样的:

$ cat test
12 13 22000 s
12 13 32000 s
100 13 2000 s
12 13 300 s

我只想将字段 3 中的 100(一旦 100 包含在 $3 中)替换为 2000。如何使用awk 完成这项工作?

【问题讨论】:

  • jww 等等,awk 是一种编程语言。 en.wikipedia.org/wiki/AWK:“AWK 是一种专为文本处理而设计的编程语言,通常用作数据提取和报告工具。”
  • 如果您想查找和替换更复杂的东西,我建议改用perl -npe。例如cat test | perl -npe 's#^(\d+\s+\d+\s+\d*)(100)#$12000#'。使用awk 是可行的,但你必须使用sub() 或类似的功能,它很快就会变成完全无法维护的混乱。

标签: linux bash awk


【解决方案1】:

这是使用awk的一种方法:

awk '{ sub(/100$/, "2000", $3) }1' file

结果:

12 13 22000 s
12 13 32000 s
100 13 2000 s
12 13 300 s

【讨论】:

  • 如何用 5000 替换不是 100 的所有内容?
  • @lovedynasty:您可以尝试类似:awk '{ sub(/[^1]*[^0]*[^0]*/, "5000", $3) }1' file。但这可能无法为您提供预期的结果。通常当我想执行某种逆模式匹配时,我会想使用某种look-around assertion。不幸的是,awk 不支持这些,我需要使用更强大的工具。我会在“自动拆分”模式下使用perl。 HTH。
【解决方案2】:

试试:

awk '{$3=gensub(100,2000,1,$3);print}' test.txt

【讨论】:

    【解决方案3】:
    awk '$3~/100/{gsub(/100/,"2000",$3)}1' your_file
    

    【讨论】:

    • 对不起,我没有正确描述问题,我已经更新了我的问题。
    • 如何用 5000 替换不是 100 的所有内容?
    猜你喜欢
    • 2022-01-04
    • 2014-07-07
    • 2021-03-09
    • 1970-01-01
    • 1970-01-01
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多