我有一个包含异构数据表的文件。文件的前两行或三行包含标题信息(表标题等)。以下行是表的行。每列可以包含字符串或数字。我想修改表的特定条目的值,我通过行和列索引指定。此条目包含一个浮点数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
)。
这只是一个例子,当然数字一般可以不同。但我认为这是我现在遇到的所有问题的例证。
答案 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