Bash 使用sed到awk重写for循环

Bash 使用sed到awk重写for循环,bash,awk,sed,Bash,Awk,Sed,我有个大问题。你能帮我吗 我的脚本将文本文件中的编号(SOL_atom_索引,例如117824)更改为带编号的文本(SOL_mol_索引,例如SOL125)。我试着把原子数改写成水分子数。水分子由3个原子组成,在本文本文件中,所有水原子的索引范围为11601到136845。 所以116101原子+116102原子+116103原子=第一水分子(SOL1)等。例如,11601将变为SOL1,116102将变为SOL2,116103将变为SOL1,116104将变为SOL2,116105将变为SOL

我有个大问题。你能帮我吗

我的脚本将文本文件中的编号(SOL_atom_索引,例如117824)更改为带编号的文本(SOL_mol_索引,例如SOL125)。我试着把原子数改写成水分子数。水分子由3个原子组成,在本文本文件中,所有水原子的索引范围为11601到136845。 所以116101原子+116102原子+116103原子=第一水分子(SOL1)等。例如,11601将变为SOL1,116102将变为SOL2,116103将变为SOL1,116104将变为SOL2,116105将变为SOL2,116106将变为SOL2,116107将变为SOL3,等等:

#!/bin/bash
SOL_atom_index=116101
number=1
SOL_mol_index=SOL$number
index=1
for index in {1..100}
do
    for SOL_mol_index in {116101..132777}
    do
        sed -i "s/$SOL_atom_index/$SOL_mol_index/g;s/$(($SOL_atom_index+1))/$SOL_mol_index/g;s/$(($SOL_atom_index+2))/$SOL_mol_index/g" eq2_12_333_new_$index.ndx
        SOL_atom_index=$(($SOL_atom_index+3))
        number=$(($number+1))
        SOL_mol_index=SOL$number
    done
    SOL_atom_index=116101
    number=1
    SOL_mol_index=SOL$number
done
是否可以在awk到awk中将其重写为类似for循环的内容

    for SOL_index in {116101..136845}
    do
            sed -i "s/$SOL_atom_index/$SOL_mol_index/g;s/$(($SOL_atom_index+1))/$SOL_mol_index/g;s/$(($SOL_atom_index+2))/$SOL_mol_index/g" eq2_12_333_new_$index.ndx
            SOL_atom_index=$(($SOL_atom_index+3))
        number=$(($number+1))
        SOL_mol_index=SOL$number
    done
我问这个问题,因为我试图使用sed并在许多文件中运行这个脚本(这就是为什么索引I{1..100})的原因,但它不起作用。因此,我将尝试在awk中为循环执行此操作,然后保存文件并使用bash for循环在所有文件中进行更改

我的意见

151 117760
275 117841
533 124168
920 126658
1054 124285
1819 123172
2073 119893
2086 119350
2210 121552
2215 126925
2726 126379
3113 120949
预期产出,例如:

151 SOL554
275 SOL581
533 SOL2690
920 SOL3520
1054 SOL2729
1819 SOL2358
2073 SOL1265
2086 SOL1084
2210 SOL1818
2215 SOL3609
2726 SOL3427
3113 SOL1617
另一个要测试的输入示例(因为此脚本适用于许多文件):

例如,这个脚本在一个文件上工作得非常完美

#!/bin/bash
SOL_atom_index=116101
number=1
SOL_mol_index=SOL$number
for SOL_index in {116101..136845}
do
        sed -i "s/$SOL_atom_index/$SOL_mol_index/g;s/$(($SOL_atom_index+1))/$SOL_mol_index/g;s/$(($SOL_atom_index+2))/$SOL_mol_index/g" eq2_8_new_100.ndx
        SOL_atom_index=$(($SOL_atom_index+3))
    number=$(($number+1))
    SOL_mol_index=SOL$number
done

但当我试图修改此脚本以处理一个houndred文件时,它不起作用。

是的,我找到了答案,我不知道出了什么问题,但最后

#!/bin/bash
SOL_atom_index=116101
number=1
SOL_mol_index=SOL$number
index=1

for index in {1..100}
do
    for SOL_index in {116101..136845}
    do
            sed -i "s/$SOL_atom_index/$SOL_mol_index/g;s/$(($SOL_atom_index+1))/$SOL_mol_index/g;s/$(($SOL_atom_index+2))/$SOL_mol_index/g" eq2_12_333_new_$index.ndx
            SOL_atom_index=$(($SOL_atom_index+3))
        number=$(($number+1))
        SOL_mol_index=SOL$number
    done
    SOL_atom_index=116101
    number=1
    SOL_mol_index=SOL$number
done

我不明白你想做什么。你能解释一下为什么117760变成了SOL554,117841变成了SOL581吗?请解释一下你的建议背后的规则code@Jakub:你说的“不起作用”是什么意思?脚本中的一个问题是,您正在创建大约170万个
sed
的子进程,而简单地用
awk
替换它们并不能改善这一点。另外,在您发布的重写尝试中,我没有看到任何awk调用。@Jakub:原始脚本中的另一个问题是,内部
for
循环将
SOL\u mol\u index
作为控制变量,但在循环体内部,您修改了这个变量:
SOL\u mol\u index=SOL$number
。这将不起作用,正如您在以下示例中看到的:{1..100}中i的
;不要重复$i;i=89;完成
。您在问题中提供了一个示例输入和示例输出,但我不知道这些数据将传递到脚本的何处或结果将被写入。您只需使用命名模式
eq2\u 12\u 333\u new\u$index.ndx
修改文件,并且每次修改都会执行16676次。我会用一个程序替换内部循环,该程序只在相应的
eq2_……
文件的行上循环,在单个进程中对每行进行必要的替换。速度如何?文件小吗?这似乎对任何大小的东西都会非常慢…看和。
#!/bin/bash
SOL_atom_index=116101
number=1
SOL_mol_index=SOL$number
for SOL_index in {116101..136845}
do
        sed -i "s/$SOL_atom_index/$SOL_mol_index/g;s/$(($SOL_atom_index+1))/$SOL_mol_index/g;s/$(($SOL_atom_index+2))/$SOL_mol_index/g" eq2_8_new_100.ndx
        SOL_atom_index=$(($SOL_atom_index+3))
    number=$(($number+1))
    SOL_mol_index=SOL$number
done
#!/bin/bash
SOL_atom_index=116101
number=1
SOL_mol_index=SOL$number
index=1

for index in {1..100}
do
    for SOL_index in {116101..136845}
    do
            sed -i "s/$SOL_atom_index/$SOL_mol_index/g;s/$(($SOL_atom_index+1))/$SOL_mol_index/g;s/$(($SOL_atom_index+2))/$SOL_mol_index/g" eq2_12_333_new_$index.ndx
            SOL_atom_index=$(($SOL_atom_index+3))
        number=$(($number+1))
        SOL_mol_index=SOL$number
    done
    SOL_atom_index=116101
    number=1
    SOL_mol_index=SOL$number
done