在perl中加入AWK

时间:2016-09-17 06:34:37

标签: perl awk

我有一个标签限制格式的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程序中?

3 个答案:

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