哪个 LINUX 命令可用于“剪切并替换列”任务?

哪个 LINUX 命令可用于“剪切并替换列”任务?

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 != lastlast另一方面,会在代码评估{$6=count;last=$4}部分时出现。

最后,1只需一个技巧,使条件始终求值为“真”并打印即可。只是一种简写,而不是{print}块。

要将结果保存到文件,请使用>shell 运算符在 shell 中重定向输出。例如

awk '$4 != last{count++};{$6=count;last=$4};1' input.txt > output.txt

相关内容