【问题标题】:awk to replace value in specific columnawk 替换特定列中的值
【发布时间】:2017-05-02 22:17:54
【问题描述】:

我有以下行:

pr: 10.00    20.00

我想用“00.00”替换第三列,同时保留行上的制表符和空格。第一列和第二列之间有一个空格,第二列和第三列之间有一个制表符。以下命令可以工作,但它会在第一列和第二列之间插入一个制表符:

awk '$1=="pr:"{OFS="\t"; $3="00.00"}1' mydata.txt > out

如何保持空格和制表符在原始行中显示?

谢谢!

【问题讨论】:

    标签: awk


    【解决方案1】:

    简单的awk方法:

    awk -F'\t| ' '{$NF="00.00"}1' input
    

    输出:

    pr: 10.00    00.00
    

    【讨论】:

    • 完全没有想到。 ++
    • @JamesBrown,是的,这就是我们喜欢 AWK 的原因,因为他的简单和强大))
    • \t| = [\t ] 甚至 [[:blank:]][[:space:]] 但在任何情况下,它的行为都与默认的 FS 相同,这将用空白字符和OP特别说他想保留间距。
    【解决方案2】:

    修复您的原始脚本只需:

    awk 'BEGIN{FS=OFS="\t"} $1~/^pr:/{$2="00.00"} 1' mydata.txt > out
    

    【讨论】:

    • 1) 您的脚本甚至无法正常工作。提示:“单引号”。 2)OP也想保留空间。怎么样?
    • 1) 引用已删除,2) OP 说 There's a space between the first and second column, and a tab between second and third column. 所以 OP 在 pr: 和第一个数字之间有一个空格,然后在两对数字之间有一个制表符 - 这就是我的脚本将输出。
    • 如果他愿意,我不会阻止他这样做。不知道你从哪里来。
    • 感谢 Ed - 从没想过我可以用一行脚本解决问题!感谢大家对我的第一个 awk 脚本的帮助。
    【解决方案3】:

    使用sub

    $ awk '{sub(/20.00/,"00.00")}1' file
    pr: 10.00    00.00
    

    或者如果它是最后一个字段:

    $ awk '{sub(/[^ \t]+$/,"00.00")}1' file
    pr: 10.00    00.00
    

    编辑:如果您使用的是 GNU awk,split记录并存储分隔符:

    $ awk '
    { 
        n=split($0,a,FS,seps)                     # save delim spaces to seps
        a[3]="00.00"                              # changes to a
        for(i=1;i<=n;i++)                         # loop to n
            printf "%s%s",a[i],(i==n?ORS:seps[i]) # print a and seps
    }' file
    pr: 10.00    00.00
    

    【讨论】:

    • 我可以保留列号吗?原因是 20.00 美元的价值有时会发生变化。我正在更改文件中的多行,而我要更新的不仅仅是一行。
    猜你喜欢
    • 2014-03-27
    • 2018-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多