http://paste.ubuntu.com/24184546/
这是文件。这里我需要将第 6 列分别替换为从 1 到 158 的数字。
输出应该是这样的, http://paste.ubuntu.com/24184581/
我该如何使用 Linux 命令来做到这一点?提前致谢。
答案1
您请求的基本上是每当第 4 列发生变化时增加计数器。awk
下面的命令正是这样做的。
$ awk '$4 != last{count++};{$6=count;last=$4};1' input.txt
ATOM 1149 N MET B 1 56.923 131.264 45.113 1.00140.13 N
ATOM 1150 CA MET B 1 58.169 131.437 44.333 1.00140.13 C
ATOM 1151 C MET B 1 58.225 130.444 43.220 1.00140.13 C
ATOM 1152 O MET B 1 58.569 130.785 42.089 1.00140.13 O
ATOM 1153 CB MET B 1 59.401 131.239 45.231 1.00140.13 C
ATOM 1154 CG MET B 1 59.536 129.826 45.799 1.00140.13 C
ATOM 1155 SD MET B 1 58.315 129.397 47.077 1.00140.13 S
ATOM 1156 CE MET B 1 59.098 130.370 48.397 1.00140.13 C
ATOM 1157 N SER B 2 57.860 129.183 43.517 1.00 86.33 N
ATOM 1158 CA SER B 2 57.898 128.164 42.517 1.00 86.33 C
ATOM 1159 C SER B 2 56.887 128.522 41.486 1.00 86.33 C
ATOM 1160 O SER B 2 55.901 129.195 41.780 1.00 86.33 O
ATOM 1161 CB SER B 2 57.559 126.761 43.047 1.00 86.33 C
ATOM 1162 OG SER B 2 56.212 126.721 43.495 1.00 86.33 O
ATOM 1163 N ALA B 3 57.122 128.084 40.237 1.00 45.56 N
ATOM 1164 CA ALA B 3 56.217 128.412 39.183 1.00 45.56 C
ATOM 1165 C ALA B 3 55.730 127.143 38.568 1.00 45.56 C
ATOM 1166 O ALA B 3 56.393 126.109 38.624 1.00 45.56 O
ATOM 1167 CB ALA B 3 56.865 129.235 38.059 1.00 45.56 C
工作原理
每个 awk 命令可以按以下方式构造:
awk '/Condition/ {code block to run on condition};'
如果缺少条件,则代码块将针对任何行运行,而不管其内容如何。在此示例中,我们检查字段$4
(列)是否已更改($4 != last
,读作字段 4 不等于变量last
)。如果条件为真(每次更改时以及在第一行,当 last 尚未设置时,条件为真),我们将增加变量count
。
{$6=count;last=$4}
无论我们在哪一行,下一个代码块都会运行。我们只需将count
变量的内容分配给字段 6,并在字段 4 中记录我们看到的内容。count
一旦脚本遇到文本的第一行,变量就会出现,并且会在命令评估部分时创建$4 != last
。last
另一方面,会在代码评估{$6=count;last=$4}
部分时出现。
最后,1
只需一个技巧,使条件始终求值为“真”并打印即可。只是一种简写,而不是{print}
块。
要将结果保存到文件,请使用>
shell 运算符在 shell 中重定向输出。例如
awk '$4 != last{count++};{$6=count;last=$4};1' input.txt > output.txt