Windows 用于删除标题行较少的文件的单行程序

Windows 用于删除标题行较少的文件的单行程序,windows,perl,Windows,Perl,这是我先前问题的下一部分。在这里,我在一个文件夹中有许多*.fa文件 假设有三个文件:1.fa,2.fa,3.fa 内容如下: 1.fa 2.fa 3.fa 以开头的行是标题,其余的是要素行 我想删除那些标题行不超过3行的文件。这里,应该删除文件2.fa和文件3.fa 当我在Windows系统上工作时,最好使用一行Perl脚本,如: for %%F in ("*.fa") do perl ... 有单行程序吗?下次,请尝试自己编写一些代码来解决这个问题,然后再寻求帮助。如果您这样做,您将学到

这是我先前问题的下一部分。在这里,我在一个文件夹中有许多
*.fa
文件

假设有三个文件:
1.fa
2.fa
3.fa

内容如下:

1.fa 2.fa 3.fa 以
开头的行是标题,其余的是要素行

我想删除那些标题行不超过3行的文件。这里,应该删除文件
2.fa
和文件
3.fa

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

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

有单行程序吗?

下次,请尝试自己编写一些代码来解决这个问题,然后再寻求帮助。如果您这样做,您将学到更多,我们不会觉得您只是要求我们编写代码。
问题很简单,所以这里有一个解决方案

请注意此解决方案应被视为快速解决方案。Borodin建议使用更干净、更容易理解和更便携的方法来实现这一点

我建议用perl这样做:

perl -nE "$count{$ARGV}++ if /^>/; END { unlink grep { $count{$_} <= 3 } keys %count }" *.fa
perl-nE“$count{$ARGV}++if/^>/;END{unlink grep{$count{$}使用一个程序。“一行程序”是不可理解的、不可移植的,并且很难调试

这是您要求的。我希望很清楚,出于测试目的,我已经注释掉了
取消链接
调用:每次重新生成
*.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;
}

我很惊讶你没有回答上一个问题,但你至少在自己尝试某件事情时表现出了一些努力。在这种情况下,你只是放弃了一个要求,要求为你完成工作。这是不可接受的。堆栈溢出是程序员可能会向他们的同龄人询问一些代码或有缺陷的问题的地方这不是一个让你免费完成工作的地方,尽管这里有些人渴望获得经验点,他们无论如何都会帮助你(见下文)。“因为我在Windows系统上工作,最好使用一行Perl脚本,比如请解释你自己。为什么你认为单行程序更适合Windows?一般来说,“单行程序”调试和理解起来要困难得多,只能由经验丰富的Perl程序员来尝试。如果您希望多次使用代码或将代码传递给其他人,则需要一个很好的借口来不编写正确的程序。@Borodin我发表的评论比回答多得多(如果您对此表示怀疑,我有很多例子),即使我的评论是一个可以接受的答案,只是因为我觉得有些人可能会建议更好的答案……我不会说自己渴望声誉。碰巧我喜欢写一行,而OP在写这个问题上做了相当大的努力(即使他没有展示任何他尝试过的代码)“这就是我发布我的答案的原因。@Dada:我接受这一点,但我不确定你为什么认为高比例的评论和答案应该是一件好事。关于“一句话”,我可以理解你对它们的兴趣,但我认为它们永远不应该被写出来供公众消费,除非情况特别需要。毕竟,代码高尔夫也很有趣,但“高尔夫”解决方案是一种没有表现力的解决方案,应该仅限于娱乐。最重要的是,“一行线”涉及到命令行处理器,在Windows上运行的命令在Linux上不起作用。一个合适的程序更有可能。@Dada:我最不高兴的是你考虑帮助这个OP,他只写了一个要求,并要求提供一个解决方案。他们不值得你的专业知识。但总的来说,我认为你应该发布任何看起来合适的东西喜欢以答案作为答案。这样你将在网站上获得适当的同行审查和适当的特权。这使用了非常讨厌的不平衡括号,它假定
perl-ne
将生成的代码的结构。它远离自我记录,虽然你可以在私人场所对自己做你喜欢做的事情,但请不要使用括号把你自己扩展到更礼貌的世界。另外,
%h
是一个散列:我们知道它是一个散列,因为你用大括号索引它,所以没有必要称它为
%h
。它包含计数,所以可能
%c
%count
%n
?@Borodin我想你是对的,我把它改成了
%END
块,对吗为了记录(不是借口),我学会了使用
}{
,因为我在你的一个答案上看到了它(很久以前)。我重新命名了hash
count
,谢谢你的建议。@Dada:请给我一个参考。如果我沉溺于这样的不愉快,我会感到惊讶,但我想我们都必须长大。这是喜欢这个糟糕模块的人追求的事情;不幸的是,它出现在CPAN上给了它很大的权威不是吗deserve@Borodin那是几个月或几年前的事了,我不知道你回答的问题是什么,但我很确定这是你的答案之一。但没关系,我同意最好在Stackoverflow上使用
END
块。@Dada:如果你揭开它,谢谢让我知道。我对一些旧的答案有过一两次畏缩我的,所以这不是不可能的。
for %%F in ("*.fa") do  perl ...
perl -nE "$count{$ARGV}++ if /^>/; END { unlink grep { $count{$_} <= 3 } keys %count }" *.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"