2017-08-05 96 views
0

我想做一個列$ i和列$((i + 33))列的簡單列,我不確定該語法是否正確。awk字段計數算術

首先將兩個文件粘貼在一起,然後執行跨兩個文件的列添加。

謝謝!

paste DOS.tmp DOS.tmp2 | awk '{ printf "%12.8f",$1 OFS; for(i=2; i<33; i++) printf "%12.8f",$i+$((i+33)) OFS; if(33) printf "%12.8f",$33+$66; printf ORS}' >| DOS.tmp3 
+2

請更新您的Q,包含大約4-6個字段的示例數據以及來自該輸入的所需輸出。如果您知道如何解決6列問題,那麼您很清楚您知道如何爲您的較大數據集解決問題。祝你好運。 – shellter

+1

你認爲'$((i + 33))'而不是'$(i + 33)'的好處是什麼? –

回答

1

awk,不像在bash,變量擴展不需要在變量名的前面美元符號($)。變量的定義類似a = 2,並使用類似print a。美元符號($) is used to refer to (input) fields。因此,print $1將打印第一個字段,print $a將打印變量a引用的字段,在我們的情況下是第二個字段。同樣,print $a, $(a+3)將打印第二個和第五個字段(由OFS分隔)。

這一切結合在一起,使你的程序是這樣的:我們使用sprintf

awk '{ out = sprintf("%12.8f", $1) 
     for (i=2; i<=33; i++) out = out sprintf("%s%12.8f", OFS, $i+$(i+33)) 
     print out }' numbers 

通知打印所有值輸出線變量out第一,concatenatingout = out val,然後打印具有完整的輸出記錄print

1

你們是不是要在file_1file_2添加列i?在這種情況下,我提供了一個例子:

paste <(seq -s' ' 33) <(seq -s' ' 33) | awk '{ for(i=1; i<=33; i++) { printf "%f",$i+$((i+33)) ; if(i!=33) printf OFS;} printf ORS}'