一行程序删除标题行少的文件

时间:2016-10-26 10:45:32

标签: windows perl

这是我之前问题perl one-liner to keep only desired lines的下一部分。这里我在文件夹中有很多*.fa个文件。

假设有三个文件:1.fa2.fa3.fa

它们的内容如下:

1.fa

>djhnk_9
abfgdddcfdafaf
ygdugidg
>kjvk.80
jdsfkdbfdkfadf
>jnck_q2
fdgsdfjghsjhsfddf
>7ytiu98
ihdlfwdfjdlfl]ol

2.fa

>cj76
dkjfhkdjcfhdjk
>67q32
nscvsdkvklsflplsad
>kbvbk
cbjfdikjbfadkjfbka

3.fa

>1290.5
mnzmnvjbsdjb

>开头的行是标题,其余行是要素行。

我想删除那些包含3个或更少标题行的文件。此处,应删除文件2.fa和文件3.fa

当我在Windows系统上工作时,最好使用一行Perl脚本,如:

for %%F in ("*.fa") do  perl ...

是否有单行程序?

2 个答案:

答案 0 :(得分:1)

下次,请尝试自己编写一些代码来解决问题,并且只有在寻求帮助之后才会这样做。如果你这样做,你会了解更多,我们不会觉得你只是要求我们编写你的代码。
问题很简单,所以这是一个解决方案。

注意,此解决方案应被视为快速解决方案。 Borodin提出了更清晰,更易于理解和更便携的方法here

我建议用perl这样做:

perl -nE "$count{$ARGV}++ if /^>/; END { unlink grep { $count{$_} <= 3 } keys %count }" *.fa

(为了记录,我使用双引号"作为字符串的分隔符,因为你在Windows上,但如果有人希望在unix系统上使用它,只需更改双-quotes "用于某些单引号')。

<强>说明:

  • -n使用while(<>){...}围绕代码,它将逐个读取文件。
  • 使用$count{$ARGV}++ if /^>/我们计算每个文件中的标头数量:$ARGV包含要读取的文件的名称,/^>/仅在行以{{1 },即。它是一个标题行。
  • 最后(>部分),我们删除(使用函数END { .. })具有3个或更少标题的文件:unlink给出所有文件名,{{1仅保留具有3个或更少标题行的文件以删除它们。

答案 1 :(得分:1)

使用程序。 &#34;一衬垫&#34;是不可理解的,不可移植的,并且很难调试

这就像你问的那样。我希望很清楚我已经注释了unlink出于测试目的的要求:每次重新生成*.fa文件会很痛苦

您可能希望将'[0-9].fa'更改为*.fa。我在我自己的目录中有其他文件,我不想被视为

use strict;
use warnings 'all';

while ( my $file = glob '[0-9].fa' ) {

    open my $fh, '<', $file;
    my $headers = grep /^>/, <$fh>;

    #unlink $file if $headers <= 3;
    print qq{deleting "$file"\n} if $headers <= 3;
}

输出

deleting "2.fa"
deleting "3.fa"