2011-07-20 113 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 } 
相關問題