在表格文件中添加数字?

时间:2015-04-08 14:38:48

标签: bash text

我有一个包含异构数据表的文件。文件的前两行或三行包含标题信息(表标题等)。以下行是表的行。每列可以包含字符串或数字。我想修改表的特定条目的值,我通过行和列索引指定。此条目包含一个浮点数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

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

这只是一个例子,当然数字一般可以不同。但我认为这是我现在遇到的所有问题的例证。

1 个答案:

答案 0 :(得分:1)

您可以使用awk

awk -v h='2.7' -v b='2.5' 'NR==3{$3 += h} NR==7{$2 += 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{$3 += h}   # for overall row #3 increment 3rd column by h
NR==7{$2 += 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