对文本文件的特定编辑(awk?)

Mad*_*per 5 bash awk text-processing

我有一个文件,看起来像

TITLE
1.000000000000000
10.0000000000000000    0.0000000000000000    0.0000000000000000 
0.0000000000000000   10.0000000000000000    0.0000000000000000
0.0000000000000000    0.0000000000000000   10.0000000000000000
U   U
X   X
C
0.2000000000000028  0.2000000000000028  0.2000000000000028
0.2967599999999990  0.0641000000000034  0.1551499999999990
0.1033699999999982  0.3361099999999979  0.244990000000001
Run Code Online (Sandbox Code Playgroud)

我需要一个脚本来修改底部数字块(低于C原始值 30。有没有这样的方法?

到目前为止,我所拥有的最好的是

$ awk '{if(NR>1){for(i=2;i<=NF;i++){$(i)=$(i)-10;}}print;}' data.txt | column -t
Run Code Online (Sandbox Code Playgroud)

但是,那是来自互联网,我不知道如何自己操纵它以达到预期的效果。然而,这不会打印/覆盖当前在 中的内容data.txt,这正是我想要的。

谢谢您的帮助!

Ser*_*nyy 1

这是我的 awk 版本:

awk '/^C/,0 {for (i=1;i<=NF;i++) { if ( $i != "C" ) printf "%.16f ",$i-30.0000};print"\n" }' data.txt

在这里,我们获取从 C 字符到文件末尾的所有内容,在每列中减去 30,添加换行符,然后重复该过程。显然,添加 if 语句是为了避免从 C 中减去 30。

输出是这样的:

    46)serg@ubuntu[/home/xieerqi]
    >_ awk '/^C/,0 {for (i=1;i<=NF;i++) { if ( $i != "C" )  printf "%.16f ",$i-30.0000};print"\n" }' data.txt                             

-29.7999999999999972 -29.7999999999999972 -29.7999999999999972 

-29.7032400000000010 -29.9358999999999966 -29.8448500000000010 

-29.8966300000000018 -29.6638900000000021 -29.7550099999999986 
Run Code Online (Sandbox Code Playgroud)

这可以在原始文件中替换;或者,我们总是可以尝试使用 BEGIN { } 语句在 C 之前打印内容