在数千个文件中,例如我有一个文件说' 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列。减去结果的文件并将输出写入文件,我该如何修改命令?谢谢你的帮助。
答案 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 }
。
如果您知道数据文件中没有空行,则可以通过利用--NF
始终评估为true
的事实来缩短awk脚本:
paste corr0.txt avg.txt | awk '{$7-=$9}--NF'