我在一个文件夹中有大约700个文本文件,每个文件都是这样的:
ATOM 46 H17 21Q A 1 8.755 9.236 19.160 1.00 10.00 H
ATOM 47 H18 21Q A 1 4.986 13.632 21.286 1.00 10.00 H
ATOM 48 H19 21Q A 1 4.073 12.279 20.536 1.00 10.00 H
ATOM 49 H20 21Q A 1 4.447 12.245 22.293 1.00 10.00 H
ATOM 50 H21 21Q A 1 -0.059 3.744 18.524 1.00 10.00 H
ATOM 51 H22 21Q A 1 0.915 2.266 18.827 1.00 10.00 H
ATOM 52 H23 21Q A 1 -0.811 2.321 19.321 1.00 10.00 H
ATOM 53 H24 21Q A 1 -0.126 -0.895 21.075 1.00 10.00 H
ATOM 54 H25 21Q A 1 1.167 0.041 20.250 1.00 10.00 H
ATOM 55 H26 21Q A 1 1.247 -0.230 22.024 1.00 10.00 H
ATOM 56 H27 21Q A 1 4.391 7.539 23.280 1.00 10.00 H
CONECT 1 2 30 31 32
CONECT 2 1 3 33 34
CONECT 3 2 5 18
CONECT 4 5 19 35
CONECT 5 3 4 6
CONECT 6 5 24 26
CONECT 7 8 12 24
我要做的是编写一个Perl脚本,能够处理我的700个文件,同时删除所有以CONECT开头的行。同时我想以原始名称保存文件。 不幸的是,我只设法打开一个文件(21Q)并将其保存在我创建的空文件中(21Q_2),不是我想要的。
#!perl
use strict;
use warnings;
use LWP::Simple;
use File::Slurp;
open(my $in, '<', 'C:\perl_old_test\TRP_ligands_PDB\21Q.txt', )
or die "Cannot open input.txt: $!";
open(my $out, '>', 'C:\perl_old_test\TRP_ligands_PDB\21Q_2.txt')
or die "Cannot open output.txt: $!";
while (<$in>) {
print $out $_ unless /\bCONECT\b/;
}
close($in);
close($out);
任何帮助都会非常感激! 非常感谢你, 阿里安娜赫芬
答案 0 :(得分:3)
你可以使用一个简单的Perl单线程来做到这一点:
perl -ni.bak -e 'print unless /^CONECT/' <filename glob>
-n
标志假定围绕您希望执行的代码循环:
while (<>) {
# code
}
-i
修改您的文本文件,.bak
创建原始文件的备份,以备您同时使用这两个副本。
-e
标志表示Perl应该执行此代码。
<filename glob>
应替换为一个模式,该模式将您要检查的所有文件组合在一起。例如,如果您希望所有文件都是*
,或者所有扩展名为.txt的文件都是*txt
。
答案 1 :(得分:0)
使用$INPLACE_EDIT
功能:
use strict;
use warnings;
use autodie;
my $file = 'C:\perl_old_test\TRP_ligands_PDB\21Q.txt'
local @ARGV = ($file);
local $^I = '.bak';
while (<>) {
print if ! /\bCONECT\b/
}
unlink "$file$^I";
有关编辑文件的其他方法,请阅读:How do I change, delete, or insert a line in a file, or append to the beginning of a file?