我正在编写一个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
我想要做的是将第一列与第二列相关联,因此1
表示N
,2
表示C
,等等。然后我可以替换最后一列中的值。
这可能吗?
谢谢!
答案 0 :(得分:1)
$ awk 'FNR==NR{a[$1]=$2; 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[$1]=$2; next;}
第一次创建数组a
,其中包含数字到化学信息。然后,跳过其余命令并跳转到next
行。
for (i=8;i<=NF;i++) $i=a[$i]
在第二次阅读时,使用数组a
将第8列更改为从数字到符号的结尾。
print
打印新修改的行。
答案 1 :(得分:0)
假设你的映射只是从一个数字到一个字母,你真的只需要一个数组。请参阅以下内容:
http://www.tldp.org/LDP/abs/html/arrays.html
如果您需要更复杂的内容,请参阅关联数组:
http://www.linuxjournal.com/content/bash-associative-arrays
如果您需要澄清,请告诉我。