从文件中的另一列中减去列,并用减去的结果替换该列

时间:2014-06-10 23:02:36

标签: awk

在数千个文件中,例如我有一个文件说' corr0.txt'像:

1 1 1 1 1 1 2.559346e-08 2.080054e-10
1 1 1 1 1 2 1.398551e-09 2.709745e-09
1 1 1 1 1 3 -7.939651e-10 -1.560374e-09
1 1 1 1 1 4 -4.734811e-09 -1.031029e-09
1 1 1 1 1 5 -7.906407e-10 -1.264427e-09
1 1 1 1 1 6 1.143652e-09 -1.662138e-09
1 1 1 1 1 7 -1.843946e-09 -2.157429e-09
1 1 1 1 1 8 -5.101709e-11 -3.662005e-10

现在我有另一个文件" avg.txt"这就像:

2.13819e-08
-3.29974e-10
-9.25384e-10
-2.3519e-10
-9.54804e-10
-6.87923e-10
2.34904e-10
1.25694e-10

要删除' avg.txt'的列。在#corr0.txt'的第7列,我写了awk命令:

awk 'FNR==NR {arr[NR]=$1; next} { print $7-arr[FNR]}'  avg.txt corr0.txt

现在,如果我想替换' corr0.txt'的第7列。减去结果的文件并将输出写入文件,我该如何修改命令?谢谢你的帮助。

2 个答案:

答案 0 :(得分:3)

只需重新分配到$7并打印整行:

$ awk 'FNR==NR{a[NR]=$1;next}{$7=$7-a[FNR];print}' avg.txt corr0.txt

答案 1 :(得分:1)

如果您追加要用paste减去的列,则可以简化任务:

paste corr0.txt avg.txt | awk '{ $7 -= $9; NF-- } 1'

管道输出column -t

1  1  1  1  1  1  4.21156e-09   2.080054e-10
1  1  1  1  1  2  1.72853e-09   2.709745e-09
1  1  1  1  1  3  1.31419e-10   -1.560374e-09
1  1  1  1  1  4  -4.49962e-09  -1.031029e-09
1  1  1  1  1  5  1.64163e-10   -1.264427e-09
1  1  1  1  1  6  1.83158e-09   -1.662138e-09
1  1  1  1  1  7  -2.07885e-09  -2.157429e-09
1  1  1  1  1  8  -1.76711e-10  -3.662005e-10

说明:

要减去的列是第9列,因此将减法分配给$7就足够了。 NF--删除现在冗余的第9列。最后的1调用默认的隐式代码块:{ print $0 }

Code golf note

如果您知道数据文件中没有空行,则可以通过利用--NF始终评估为true的事实来缩短awk脚本:

paste corr0.txt avg.txt | awk '{$7-=$9}--NF'