【问题标题】:subtraction between two columns with awk or sed使用 awk 或 sed 在两列之间进行减法
【发布时间】:2012-10-05 05:02:34
【问题描述】:

我有一些文本文件。我需要在每个文件的第二列和第四列之间做减法。减去的值应作为第五列打印到原始文件中。如何使用 awk 或 sed 做到这一点?

HII 62.0    HII 35.1
MEE 21.3    MEE 21.3
GLL 42.3    GLL 18.5
ASS 105.9   ASS 105.9
RRG 65.6
GLL 48.3
SES 83.5    

Desired output

HII 62.0    HII 35.1   26.9
MEE 21.3    MEE 21.3    0
GLL 42.3    GLL 18.5   23.8
ASS 105.9   ASS 105.9   0
RRG 65.6
GLL 48.3
SES 83.5

如果第三列和第四列为空,则不需要减去。

【问题讨论】:

    标签: sed awk


    【解决方案1】:
    awk 'NF == 2 { print }
         NF == 4 { print $0, $2 - $4 }'
    

    这可以全部放在一条线上,但是当它分布在两条线上时会更清楚它在做什么。

    如果您想对格式进行更多控制,可以使用printf() 而不仅仅是print

    清理数据中的尾随空格后,它会生成:

    HII 62.0    HII 35.1 26.9
    MEE 21.3    MEE 21.3 0
    GLL 42.3    GLL 18.5 23.8
    ASS 105.9   ASS 105.9 0
    RRG 65.6
    GLL 48.3
    SES 83.5
    

    【讨论】:

    • 感谢您的回答。我需要将减去的值作为第五列打印到原始文件中。我该如何更改您的代码?
    • 不能直接做; awk(至少,POSIX awk)不提供“覆盖”选项。因此,您可以将脚本的输出写入临时文件,然后将临时文件复制或移回原始文件:awk '...' data > x; cp x data; rm -f x 或该主题的轻微变化。
    【解决方案2】:

    这可能对你有用(GNU sed 和 Bash):

    sed -ri '/^\S+\s+(\S+)\s+\S+\s+(\S+)/s//echo "&\t$(echo \1-\2|bc)"/e' file
    

    【讨论】:

    • 我应该指出这在大文件上会很慢,而 Jonathan Leffler 建议的方式会快很多。另一种 awk 解决方案是 awk 'NF==4{$5=$2-$4};1' file
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多