首页 > 解决方案 > 用 sed 将 for 循环重写为 awk

问题描述

我有一个大问题。你可以帮帮我吗

我的脚本将文本文件中的数字(SOL_atom_index,例如 117824)更改为带有数字的文本(SOL_mol_index,例如 SOL125)。我尝试将原子数重写为水分子数。水分子由 3 个原子组成,在这个文本文件中,所有水原子的索引从 116101 到 136845。所以 116101 原子 + 116102 原子 +116103 原子 = 第一个水分子 (SOL1).etc。例如 116101 将更改为 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 并在许多文件中运行此脚本(这就是为什么有 for index i {1..100}),但它不起作用Bash 脚本无法使用 for loop 处理许多文件。因此,我将尝试在 awk 中执行此 for 循环,然后保存文件并使用 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

另一个要测试的输入示例(因为此脚本适用于许多文件):

13 119740
1054 122809
1694 118417
2086 121990
2602 120586
2731 123091
3242 119419
3629 117304
3750 124873
7370 116332
7499 116464
7624 120970
7749 126085
7757 116644
8011 126892
8140 122509

例如,此脚本适用于一个文件

#!/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

但是当我尝试修改这个脚本来处理一百个文件时它不起作用。

标签: bashawksed

解决方案


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

#!/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

推荐阅读