使用awk或sed在两列之间进行减法

使用awk或sed在两列之间进行减法,sed,awk,Sed,Awk,我有一些文本文件。我需要在每个文件的第二列和第四列之间进行减法运算。减去的值应作为第五列打印到原始文件中。如何使用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.

我有一些文本文件。我需要在每个文件的第二列和第四列之间进行减法运算。减去的值应作为第五列打印到原始文件中。如何使用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
如果第三列和第四列为空,则无需减去

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
这些都可以安装在一条线路上,但当它分布在两条线路上时,它所做的事情就更清楚了

如果您想对格式进行更多控制,可以使用
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
这可能适合您(GNU-sed&Bash):

这可能适合您(GNU-sed&Bash):


谢谢你的回答。我需要将减去的值作为第五列打印到原始文件中。我如何更改您的代码?您不能直接更改代码
awk
(至少POSIX
awk
)不提供“覆盖”选项。因此,您需要将脚本的输出写入一个临时文件,然后将临时文件复制或移回原始文件:
awk'…'data>x;cpx数据;rm-f x
或该主题的轻微变化。谢谢您的回答。我需要将减去的值作为第五列打印到原始文件中。我如何更改您的代码?您不能直接更改代码
awk
(至少POSIX
awk
)不提供“覆盖”选项。因此,您需要将脚本的输出写入一个临时文件,然后将临时文件复制或移回原始文件:
awk'…'data>x;cpx数据;rm-f x
或该主题的轻微变化。我应该指出,这在大文件上会很慢,Jonathan Leffler提出的方法会快得多。另一种awk解决方案是
awk'NF==4{$5=$2-$4};1'文件
我应该指出,对于大文件来说,这会很慢,乔纳森·莱夫勒提出的方法会快得多。另一种awk解决方案是
awk'NF==4{$5=$2-$4};1'文件