从多个(700+)文本文件中删除以特定单词开头的所有行

时间:2014-07-09 17:37:05

标签: windows perl text file-io

我在一个文件夹中有大约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);

任何帮助都会非常感激! 非常感谢你, 阿里安娜赫芬

2 个答案:

答案 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?