链接两个参数 - Shell 脚本
Linking two arguments - Shell Script
我正在编写一个 shell 脚本,这里是一个示例输入文件。
1 N 0.000000 0.000000 0.000000 0 2 5 6 7
2 C 0.000000 0.000000 1.480000 0 1 3 8 9
3 C 1.430212 0.000000 2.000555 0 2 4 13
4 O 2.255128 -0.786666 1.463647 0 3
5 H -0.693210 0.693210 -0.347159 0 1
6 H -0.252566 -0.947254 -0.347159 0 1
7 H 0.947254 0.252566 -0.347159 0 1
8 H -0.501852 0.899485 1.804762 0 2
9 C -0.697228 -1.265943 2.006027 0 2 10 11 12
10 H -0.698163 -1.267642 3.117025 0 9
11 H -0.159269 -2.172191 1.654408 0 9
12 H -1.750698 -1.295700 1.654408 0 9
13 O 1.717017 0.786666 2.942096 0 3
我想要做的是 link 第一列和第二列,所以 1
表示 N
,2
表示 C
,等等。然后我可以替换最后一列中的值。
这可能吗?
谢谢!
假设您的映射只是从数字到字母,那么您实际上只需要一个数组。请参阅以下内容:
http://www.tldp.org/LDP/abs/html/arrays.html
如果您需要更复杂的东西,请参阅关联数组:
http://www.linuxjournal.com/content/bash-associative-arrays
如果您需要说明,请告诉我。
$ awk 'FNR==NR{a[]=; next;} {for (i=8;i<=NF;i++) $i=a[$i]; print;}' file file | column -t
1 N 0.000000 0.000000 0.000000 0 2 H H H
2 C 0.000000 0.000000 1.480000 0 1 C H C
3 C 1.430212 0.000000 2.000555 0 2 O O
4 O 2.255128 -0.786666 1.463647 0 3
5 H -0.693210 0.693210 -0.347159 0 1
6 H -0.252566 -0.947254 -0.347159 0 1
7 H 0.947254 0.252566 -0.347159 0 1
8 H -0.501852 0.899485 1.804762 0 2
9 C -0.697228 -1.265943 2.006027 0 2 H H H
10 H -0.698163 -1.267642 3.117025 0 9
11 H -0.159269 -2.172191 1.654408 0 9
12 H -1.750698 -1.295700 1.654408 0 9
13 O 1.717017 0.786666 2.942096 0 3
工作原理
awk 脚本读取文件两次。第一次通过时,它创建一个数组以将数字转换为化学符号。第二次通过时,它用新的化学符号写出行。
FNR==NR{a[]=; next;}
在第一次通过时,创建数组 a
,其中包含数字到化学信息。然后,跳过其余命令并跳转到 next
行。
for (i=8;i<=NF;i++) $i=a[$i]
在第二次通读时,使用数组 a
将第 8 列的末尾从数字更改为符号。
print
打印新修改的行。
我正在编写一个 shell 脚本,这里是一个示例输入文件。
1 N 0.000000 0.000000 0.000000 0 2 5 6 7
2 C 0.000000 0.000000 1.480000 0 1 3 8 9
3 C 1.430212 0.000000 2.000555 0 2 4 13
4 O 2.255128 -0.786666 1.463647 0 3
5 H -0.693210 0.693210 -0.347159 0 1
6 H -0.252566 -0.947254 -0.347159 0 1
7 H 0.947254 0.252566 -0.347159 0 1
8 H -0.501852 0.899485 1.804762 0 2
9 C -0.697228 -1.265943 2.006027 0 2 10 11 12
10 H -0.698163 -1.267642 3.117025 0 9
11 H -0.159269 -2.172191 1.654408 0 9
12 H -1.750698 -1.295700 1.654408 0 9
13 O 1.717017 0.786666 2.942096 0 3
我想要做的是 link 第一列和第二列,所以 1
表示 N
,2
表示 C
,等等。然后我可以替换最后一列中的值。
这可能吗?
谢谢!
假设您的映射只是从数字到字母,那么您实际上只需要一个数组。请参阅以下内容:
http://www.tldp.org/LDP/abs/html/arrays.html
如果您需要更复杂的东西,请参阅关联数组:
http://www.linuxjournal.com/content/bash-associative-arrays
如果您需要说明,请告诉我。
$ awk 'FNR==NR{a[]=; next;} {for (i=8;i<=NF;i++) $i=a[$i]; print;}' file file | column -t
1 N 0.000000 0.000000 0.000000 0 2 H H H
2 C 0.000000 0.000000 1.480000 0 1 C H C
3 C 1.430212 0.000000 2.000555 0 2 O O
4 O 2.255128 -0.786666 1.463647 0 3
5 H -0.693210 0.693210 -0.347159 0 1
6 H -0.252566 -0.947254 -0.347159 0 1
7 H 0.947254 0.252566 -0.347159 0 1
8 H -0.501852 0.899485 1.804762 0 2
9 C -0.697228 -1.265943 2.006027 0 2 H H H
10 H -0.698163 -1.267642 3.117025 0 9
11 H -0.159269 -2.172191 1.654408 0 9
12 H -1.750698 -1.295700 1.654408 0 9
13 O 1.717017 0.786666 2.942096 0 3
工作原理
awk 脚本读取文件两次。第一次通过时,它创建一个数组以将数字转换为化学符号。第二次通过时,它用新的化学符号写出行。
FNR==NR{a[]=; next;}
在第一次通过时,创建数组
a
,其中包含数字到化学信息。然后,跳过其余命令并跳转到next
行。for (i=8;i<=NF;i++) $i=a[$i]
在第二次通读时,使用数组
a
将第 8 列的末尾从数字更改为符号。print
打印新修改的行。