将数字添加到 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
我有一个包含异构数据的 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