我需要支持才能对包含大约 5000 行的文件执行以下任务。
输入
cp abc/P_10_10A.pdb lig.pdb
cp abc/protein.pdbqt .
cp abc/run.pl .
./run.pl
cp abc/P_10_11A.pdb lig.pdb
cp abc/protein.pdbqt .
cp abc/run.pl .
./run.pl
cp abc/P_10_11B.pdb lig.pdb
cp abc/protein.pdbqt .
cp abc/run.pl .
./run.pl
输出
cp abc/P_10_10A.pdb lig.pdb
cp abc/protein.pdbqt .
cp abc/run.pl .
./run.pl
mv *.* P_10_10A
cp abc/P_10_11A.pdb lig.pdb
cp abc/protein.pdbqt .
cp abc/run.pl .
./run.pl
mv *.* P_10_11A
cp abc/P_10_11B.pdb lig.pdb
cp abc/protein.pdbqt .
cp abc/run.pl .
./run.pl
mv *.* P_10_11B
我可以添加 mv . 如下..
sed '0~4 a\mv *.* \' text_file.sh
剩下的我该怎么做?非常感谢。
最佳答案
sed 版本
sed '/^[[:blank:]]*cp /,/^[[:blank:]]*\./ {
H
/^[[:blank:]]*\./!d
s/.*//;x
s#^\(\(.[[:blank:]]*\)cp \)\([^[:blank:]]*/\([^[:blank:]]*\)\)\(\.pdb.*\)#\1\3\5\2mv *.* \4#
}' YourFile
信息:
- 从第一个 cp 开始按段落 (
/^[[:blank:]]*cp/,/^[[:blank:]]*\./
) 进行,直到 ./ - 将每一行添加到保存缓冲区 (
H
) - 如果不是段落的最后一行,则从当前工作缓冲区中删除该行(因此不执行任何操作并循环读取下一行)(
/^[[:blank:]]*\./!d
) - 清空该行并交换缓冲区内容 (
s/.*//;x
) 提取段落的文件名并将其添加到带有
mv
信息的末尾(s#^\(\(.[ [:空白:]]*\)cp\)\([^[:空白:]]*/\([^[:空白:]]*\)\)\(\.pdb.*\)#\1\3\5\2mv *.*\4#
)。这个正则表达式是一个棘手的正则表达式,其中包含一些特殊信息- 有一个新行作为第一个字符(由于第一个
H
而不是h
) - 我使用多个子组来轻松地将它们用作模式,例如第二组、新行和第一组中包含的第一组空格(如果有)
- 有一个新行作为第一个字符(由于第一个
让 sed 打印结果
- 修改段落
- 未触及的行,例如段落之间的空行
awk 版本
awk -F '[/.]' '
/cp / {f[n++]=$2}
/\.\/run/ {print;sub( /\..*/, "mv *.* " f[n=0])}
7
' YourFile
信息:
- 使用
.
和/
作为字段分隔符(-F '[/.]'
) - 对于带有 cp 的每一行,保留文件夹名称和增量数组(第一个索引 = 0)(
/cp/{f[n++]=$2}
) - 对于每行
./run
: (/\.\/run/{print;sub(/\..*/, "mv *.* "f[n =0])}
)- 打印该行
- 将文本部分替换为
mv ...
- 好名字永远是f[0]
- 同时重置索引 (
n=0
)
- 打印行
7
关于perl - 在文件中的指定行之后插入文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41632817/