2017-08-05 145 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}'