2012-10-05 59 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「或該主題上的輕微變化。 –