【问题标题】:Replacing a csv field value using awk使用 awk 替换 csv 字段值
【发布时间】:2016-10-29 13:56:41
【问题描述】:

我有一个类似以下示例的 csv 文件:

fieldname1: "This is field1", "id":55, fieldname2: "This is field2", "id":66

我想使用 awk 命令将第四个字段从 ""id":66" 替换为 ""id":72"。我已经尝试过以下方式,但出现语法错误:

awk -F, '{${4}="\"id\":999";}1' OFS=, rule.txt

错误是:

awk: {${4}="\"id\":999";}1

awk: ^ 语法错误

awk: {${4}="\"id\":999";}1

awk: ^ 语法错误

awk:命令。行:1:{${4}="\"id\":999";}1 awk:命令。 line:1: ^ 意外的换行符或字符串结尾

对正确的做法有什么建议吗?

【问题讨论】:

    标签: bash csv awk


    【解决方案1】:

    你只需要说$4而不是${4}

    $ awk -F, '{$4="\"id\":999";}1' OFS=, file
    #           ^^
    fieldname1: "This is field1", "id":55, fieldname2: "This is field2","id":999
    

    如果您想通过变量给出值,请照常使用-v value="$bash_var"

    $ awk -F, -v val=999 '{$4="\"id\":" val;}1' OFS=, file
    #         ^^^^^^^^^^              ^^^^^
    fieldname1: "This is field1", "id":55, fieldname2: "This is field2","id":999
    

    请注意,${ } 在 Bash 中使用,以避免在使用变量 $hello 时与 $hello_you 混淆时混淆,例如 echo "$hello_you" -> 在这种情况下,您会说 echo "${hello}_you" 来定义范围变量的名称。

    但是在awk 中这样的事情不应该是必要的,因为你将字符串部分括在双引号中:

    $ awk 'BEGIN {a=23; print a"_b"}'
    23_b
    

    【讨论】:

    • 谢谢你的作品!如果我想用 bash 变量替换 '999' 怎么样,这可能吗?
    猜你喜欢
    • 1970-01-01
    • 2014-03-05
    • 2011-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-19
    • 2017-02-08
    • 1970-01-01
    相关资源
    最近更新 更多