链接两个参数 - 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 表示 N2 表示 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

    打印新修改的行。