简短的:

简短的:

我有一个文本文件,第 23 个字符的所有值都是,0但我需要它们的值X从 开始1并每行递增,58直到达到最终值64

我尝试使用此sed代码,但它并不具体,并将所有0值更改为64值。

for i in $(seq 1 1 64); do
   sed -e "s/0/$i/g" file.txt > newfile.txt
done

我所拥有的是;

ATOM  1     C0   ODA  0          1.452   2.430  23.632  1.00  1.00           C
ATOM  2     C1   ODA  0          1.839   1.672  22.372  1.00  1.00           C
...
ATOM  3711  H56  ODA  0         30.750  32.945   0.998  1.00  1.00           H
ATOM  3712  H57  ODA  0         31.934  32.195   0.165  1.00  1.00           H

而我想要的是;

ATOM  1     C0   ODA  1          1.452   2.430  23.632  1.00  1.00           C
ATOM  2     C1   ODA  1          1.839   1.672  22.372  1.00  1.00           C
...
ATOM  3711  H56  ODA  64        30.750  32.945   0.998  1.00  1.00           H
ATOM  3712  H57  ODA  64        31.934  32.195   0.165  1.00  1.00           H

我还没有习惯使用sed它,这只是我的 bash 知识的极限。我认为awk可能会更好,但我对此一无所知。

答案1

如果你真的需要修改 中的特定字符位置awk,那么可以设置一个空字段字段分隔符:

awk 'BEGIN{FS=""; OFS=FS} {$23 = int(FNR / 58) + 1 ; print}' file

OTOH如果你真的想修改第五个空格分隔的场地那么你可以只使用默认的分隔符

awk '{$5 = int(FNR / 58) + 1 ; print}' file

答案2

perl -lpe 's/^.{22}\K0/$. % 58 ? $a||0 : $a++/e'  yourfile

简短的:

跳过前 22 个字符,并让它们不出现在匹配中,因为\K第 23 个字符肯定是0符合您的规范的。行号$. % 58将告诉我们是否需要保持计数器保持不变或递增。

答案3

要仅替换第 23 列(或给定示例中的第 5 列)中的 0,您需要如下所示:

sed -e "s/^\(\(\S\S*\s\s*\)\{4\}\)0 /\1$i/" file.txt > newfile.txt

但这句话只是为了提高你的 sed 知识。用递增变量替换并不是典型的 sed 工作。这是可能的,但不切实际。您可以将 sed 与 shell 脚本混合使用,但也许您最好使用您选择的脚本语言,例如 python 或 perl。

相关内容