2012-10-05 57 views
0

我有一些文本文件。我需要在每个文件的第二列和第四列之间进行减法。减号值应作为第五列打印到原始文件。我如何用awk或sed来做到这一点?两列之间用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 

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

回答

1

这可能会为你工作(GNU sed的&击):

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

非常感谢! – charlie

+0

我应该指出这对大文件来说会很慢,Jonathan Leffler提出的方式会快很多。另一个awk解决方案是'awk'NF == 4 {$ 5 = $ 2- $ 4}; 1'文件' – potong

3
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 
+0

谢谢您的回答。我需要将减去的值作为第五列打印到原始文件中。我该如何改变你的代码? – charlie

+0

你不能直接做; 'awk'(至少,POSIX'awk')不提供'覆盖'选项。所以,你会将脚本的输出写入临时文件,然后将临时文件复制或移回原始文件:awk'data'x; cp x data; rm -f x“或该主题上的轻微变化。 –