2013-08-01 52 views
1

我的數據看起來像這樣:使用鍵和配對元件的Perl

G1 G2 G3 G4 
Pf1 NO B1 NO D1 
Pf2 NO NO C1 D1 
Pf3 A1 B1 NO D1 
Pf4 A1 NO C1 D2 
Pf5 A3 B2 C2 D3 
Pf6 NO B3 NO D3 

我的目的是在各列中,以檢查是否一個元素(從「否」的情況下不同)在列顯示兩次(如A1 2),並且只有兩次(如果它顯示了三次或更多,我不希望它在輸出中),並且如果是這樣,則寫入第一列的相應元素。因此,所需的輸出看起來是這樣的:

Pf3 Pf4 A1 
Pf1 Pf3 B1 
Pf2 Pf4 C1 
Pf5 Pf6 D3 

我試圖寫一個Perl腳本,但我需要一些幫助把重點放在不同的步驟。這是我到目前爲止所做的:

open (HAN, "< $file_in") || die "Impossible open the in_file"; 
@r = <HAN>; 
close (HAN); 
for ($i=0; $i<=$#r; $i++){ 
chomp ($r[$i]); 
($Ids, @v) = split (/\t/, $r[$i]); 
} 
} 

但是我不能繼續向任何方向發展! (我的Perl知識需要被你推!)

在我腦海中的熱點是:

  • 如何比較(在同一個文件或反正)來自同一列的元素?

  • 如何將第一列的元素與其他列元素(可能是鍵)相關聯?

任何幫助是絕對必要和歡迎!

+0

也許是的,鍵值已經足夠你的願望 – gaussblurinc

回答

1
use Data::Dumper; 

my %hash; 
while (<DATA>) { 

    next if $.==1; 
    chomp; 
    my ($first,@others) = (split /\s+/); 
    for (@others){ 
     $hash{$_}.=' '.$first; 
    } 
} 

print Dumper \%hash; 
__DATA__ 
    G1 G2 G3 G4 
Pf1 NO B1 NO D1 
Pf2 NO NO C1 D1 
Pf3 A1 B1 NO D1 
Pf4 A1 NO C1 D2 
Pf5 A3 B2 C2 D3 
Pf6 NO B3 NO D3 

我用什麼嗎? (技巧)

while (<DATA>){BLOCK} - 從Perl腳本文件的特定DATA部分讀取數據。 (是的,你可以把測試數據在這裏,如果你想,但不存儲一切,這不是一個垃圾桶。!)

next if $.==1 - $. - 特殊變量,存儲輸入數據的行號。像'索引'。

chomp; - 返回while(<DATA>)。 Perl中的一些變量是隱藏的。在函數中 - @_輸入參數數組。總是Perl程序員喜歡使用$_ - You變量。

而這個while(<DATA>)真的是隱藏的while(defined($_ = <DATA>))

功能chomp使用hidden-You變量,並嘗試在最後加上\ n符號。

功能split /REGEX/也作爲默認變量hidden-You變量($_)。

+0

謝謝!並感謝技巧解釋...非常照亮! – Gabelins

+0

@Gabelins Perl是你見過的最好的魔法;) – gaussblurinc

1

的Perl多襯墊:),

perl -anE ' 
    /^\S/ or next; 
    $k = shift @F; 
    push @{$t{$_}}, $k [email protected]; 
    }{ 
    @$_-1==2 and say join" ",@$_ for map [@{$t{$_}},$_], sort keys%t; 
' file 
+2

沒有換行符會使事情變成一行*正確嗎? –

+0

@HunterMcMillen你是對的,但在一開始似乎它應該適合「一行」 –

+0

@mpapec好的一個,但你可以添加評論到你的多行?:) OP,我認爲,會害怕你的魔力;) – gaussblurinc