将数字添加到 table 文件中的条目?

Add number to entry in table file?

我有一个包含异构数据的 table 文件。文件的前两行或三行包含 header 信息(table 标题等)。下面几行是table的行。每列可以包含字符串或数字。我想修改由行和列索引指定的 table 的特定条目的值。此条目包含一个浮点数 x,我想将其替换为 x+y,其中 y 是我将输入的另一个浮点数。我如何使用 bash 脚本执行此操作?

示例输入文件

atomic structure.
created 8/4/15. author: becko
increment= 3.4, 2.4
 O    0.000000 0    0.000000 0    0.000000 0       0    0    0
 C    1.422713 1    0.000000 0    0.000000 0       1    0    0
 C    1.536633 1  109.666084 1    0.000000 0       2    1    0
 C    1.523232 1  110.673515 1   53.747574 1       3    2    1
 C    1.524902 1  110.675377 1  -51.051605 1       4    3    2
 C    1.524624 1  110.815956 1   53.399712 1       5    4    3
 O    1.388625 1  108.653427 1  -68.335587 1       2    3    4
 O    1.418326 1  111.098351 1   58.126965 1       3    2    7
 O    1.429752 1  106.981445 1 -172.599930 1       4    3    2
 O    1.431727 1  110.929413 1  171.804962 1       5    4    3
 C    1.389881 1  117.191086 1   95.674500 0      10    5    4
 C    1.529863 1  107.679131 1  146.326675 0      11   10    5
 C    1.524202 1  110.428741 1  170.992218 1      12   11   10

在此示例中,前三行是文本 header,第一列是字符串(在本例中为单个字符),其余列包含数字(整数或浮点数)。举个例子,我想将条目 (4,2)(包含值 1.523232)的值增加 2.5,并将结果 table 保存为新文本文件。我怎样才能做到这一点?此外,在 header 中,我想将第三行的第二个值(目前是 2.4)增加 2.7

这只是一个示例,当然,一般情况下数字可能会有所不同。但我认为这体现了我现在遇到的所有问题。

您可以使用 awk:

awk -v h='2.7' -v b='2.5' 'NR==3{ += h} NR==7{ += b} 1' file | column -t
atomic      structure.
created     8/4/15.     author:  becko
increment=  3.4,        5.1
O           0.000000    0        0.000000    0  0.000000     0  0   0   0
C           1.422713    1        0.000000    0  0.000000     0  1   0   0
C           1.536633    1        109.666084  1  0.000000     0  2   1   0
C           4.02323     1        110.673515  1  53.747574    1  3   2   1
C           1.524902    1        110.675377  1  -51.051605   1  4   3   2
C           1.524624    1        110.815956  1  53.399712    1  5   4   3
O           1.388625    1        108.653427  1  -68.335587   1  2   3   4
O           1.418326    1        111.098351  1  58.126965    1  3   2   7
O           1.429752    1        106.981445  1  -172.599930  1  4   3   2
O           1.431727    1        110.929413  1  171.804962   1  5   4   3
C           1.389881    1        117.191086  1  95.674500    0  10  5   4
C           1.529863    1        107.679131  1  146.326675   0  11  10  5
C           1.524202    1        110.428741  1  170.992218   1  12  11  10

解释:

-v h='2.7'       # pass an argument h to awk for header increment
-v b='2.5'       # pass an argument b to awk for body increment
NR==3{ += h}   # for overall row #3 increment 3rd column by h
NR==7{ += b}   # for overall row #7 increment 2nd column by b
1                # default action to print the output 
column -t        # format the output in tabular format