2011-07-20 110 views
1

我有一个制表符分隔的文本文件。我已将它分成若干列。前两列中的每一列都包含一个ID号码。删除特定列中没有指定模式的文件中的行

我想保留所有以P或Q开头的ID号的行,并删除其他行中列1或2有其他ID或空白的行。

例如。因此要保留的列将如下所示:P12345或Q12345。删除的列将是GAG123,CH123等或只是空白。

我无法解决如何做到这一点。我已经尝试将行分割成数组和grep/^ [PQ]/elements [0]和[1]以及其他各种各样的东西,但是我必须做出错误的事情。

我试着从TLP下面的follwoing代码,但它不会工作,我知道我必须做根本错误的东西:

#!/usr/bin/perl 

use warnings; 
use strict; 

open(FILE,"<myfile.txt"); 
my @LINES = <FILE>; 
open(my $outfile, '>', 'changedtxt'); 
my @wanted; 

while (<FILE>) { 
    my @fields = split('\t', $_); 
    if ($fields[0] =~ /^[PQ]/ and $fields[1] =~ /^[PQ]/) { 
     push @wanted, $_; 
     print {$outfile} $_;  
    } 
} 
exit: 
+1

请张贴你到目前为止的代码。 – Mat

+0

你到目前为止得到了哪些代码? – hexcoder

+0

如果一个ID以P或Q开头,但其他ID不是? – TLP

回答

1
use strict; 
use warnings; 

my @wanted; 
while (<$fh>) { 
    my @fields = split /\t/, $_; 
    if ($fields[0] =~ /^[PQ]/ or $fields[1] =~ /^[PQ]/) { 
     push @wanted, $_; 
    } 
} 

如果你想同时标识开始与P或Q,为and交换or

如果你只是想通缉线移动到另一个文件,只需做:

perl -wnae 'print if (($F[0] =~ /^[PQ]/) or ($F[1] =~ /^[PQ]/))' input.txt > output.txt 

或者为脚本,以使用script.pl input.txt > output.txt

use warnings; 
use strict; 

while (<>) { 
    my @fields = split(/\t/, $_); 
    print if ($fields[0] =~ /^[PQ]/ and $fields[1] =~ /^[PQ]/); 

} 

请注意,您不能使用'\t'作为分割模式。

+0

谢谢,为此。我试过这段代码,但没有输出: –

+0

有了这段代码,你就没有输出。你只需在'@ wanted'数组中得到你想要的行。如果你想输出,你必须添加它。 – TLP

+0

对不起,我的意思是添加我的aditional代码,但它在我有机会实现之前添加了我的评论! –

3

您可以使用awk将打印出来的记录中,其中第一或第二场开始,P或Q:

awk -F'\t' '$1~/[PQ].*/ || $2~/[PQ].*/ {print}' file 
1

你也可以做一个行:

cat yourfile.txt | perl -e 'while (<>) { print if m/^[PQ]/xmsi && m/\t+[PQ]/xmsi } 
相关问题