我有一个文本文件,第 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。