我有一个标签限制格式的BLAST输出文件。喜欢这个
p=BAC58264.1 CP014046.1 100.00 435 0 0 1 435 804117 8045 862
p=BAC58264.1 CP014046.1 100.00 160 0 0 3 372 444601 4443 32
p=BAC58264.1 BA000031.2 100.00 435 0 0 1 435 805024 371 862
我想基于第3列
对此进行排序p=BAC58264.1 CP014046.1 100.00 435 0 0 1 435 804117 8045 862
p=BAC58264.1 BA000031.2 100.00 435 0 0 1 435 805024 371 862
我通常通过此awk代码执行此操作" $ 4> = 435"> BLASTSORT
如何将这个awk代码合并到Perl程序中?
答案 0 :(得分:2)
在Perl中做这件事要好得多,而不是仅为一些简单的文本处理启动一个全新的过程
我需要查看Perl代码的其余部分以确定代码应该是什么样子,但是如果您逐行读取一个名为$line
的变量的文件,那么你可以这样做
my @fields = split ' ', $line;
print $line if $fields[3] >= 435;
如果您想显示现有的Perl代码,我将优化此
答案 1 :(得分:1)
use strict;
while (<DATA>){
my @data = split /\t/,$_;
print "@data\n" if $data[3]>=435;
}
__DATA__
p=BAC58264.1 CP014046.1 100.00 435 0 0 1 435 804117 8045 862
p=BAC58264.1 CP014046.1 100.00 160 0 0 3 372 444601 4443 32
p=BAC58264.1 BA000031.2 100.00 435 0 0 1 435 805024 371 862
答案 2 :(得分:-1)
使用perl在列上应用条件,同时流式传输文件
Perl程序作为文件执行:
#!/usr/bin/perl
# test.pl
use strict;
use warnings;
while(<>) {
my @a = split(/\s+/); # \t works also, but \s+ cover multiple tabs and spaces
print if($a[3] >= 435);
}
<强>输入强>
> cat textFile.txt
p=BAC58264.1 CP014046.1 100.00 435 0 0 1 435 804117 8045 862
p=BAC58264.1 CP014046.1 100.00 160 0 0 3 372 444601 4443 32
p=BAC58264.1 BA000031.2 100.00 435 0 0 1 435 805024 371 862
<强>输出强>
> cat textFile.txt | perl ./test.pl
p=BAC58264.1 CP014046.1 100.00 435 0 0 1 435 804117 8045 862
p=BAC58264.1 BA000031.2 100.00 435 0 0 1 435 805024 371 862
Perl程序作为单行程序执行:
> cat textFile.txt | perl -ne '@a = split(/\s+/); print if($a[3] >= 435);'
p=BAC58264.1 CP014046.1 100.00 435 0 0 1 435 804117 8045 862
p=BAC58264.1 BA000031.2 100.00 435 0 0 1 435 805024 371 862
解释单行:
perl -e # perl one-liner switch
perl -ne # puts an implicit loop for each line of input