bash - 用 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
但是当我尝试修改这个脚本来处理一百个文件时它不起作用。
解决方案
是的,我找到了答案,我不知道出了什么问题,但最后
#!/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
推荐阅读
- sql - MSSQL - 如何根据准备日期汇总数量以输入散点图?
- angular - 如果值匹配,如何检查角度材料复选框
- javascript - UTF8 从 PHP 到 JS 警报
- php - 如何在 xpath 和 DOM 操作 (PHP) 之后检索生成的 DOM 标记字符串?
- java - 带有netty“反射setAccessible(true)禁用”的spring-web-flux错误
- sql - 关于 PL/SQL SELECT 语句的基本问题,如何声明
- sql - INSERT INTO 具有现有行的多对多表
- powershell - Powershell,在文本文件中逐行替换字符串
- xml - 如何在 Odoo 11 的日历视图中显示自己的看板卡?
- c++ - 对于 qml 客户端,从 C++ 注册 QtWayland 失败