这是我之前问题perl one-liner to keep only desired lines的下一部分。这里我在文件夹中有很多*.fa
个文件。
假设有三个文件:1.fa
,2.fa
,3.fa
它们的内容如下:
>djhnk_9
abfgdddcfdafaf
ygdugidg
>kjvk.80
jdsfkdbfdkfadf
>jnck_q2
fdgsdfjghsjhsfddf
>7ytiu98
ihdlfwdfjdlfl]ol
>cj76
dkjfhkdjcfhdjk
>67q32
nscvsdkvklsflplsad
>kbvbk
cbjfdikjbfadkjfbka
>1290.5
mnzmnvjbsdjb
以>
开头的行是标题,其余行是要素行。
我想删除那些包含3个或更少标题行的文件。此处,应删除文件2.fa
和文件3.fa
。
当我在Windows系统上工作时,最好使用一行Perl脚本,如:
for %%F in ("*.fa") do perl ...
是否有单行程序?
答案 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"