2015-11-20 30 views
0

按說有條件地從一個.txt文件打印特定列我將利用:印刷只有一欄的內容部分.txt文件

perl -lane 'print "$F[0]\t$F[1]\t$F[5]" if $F[1] > 0 && $F[0] =~ /^A$/ && $F[3] =~ /^A$/' input.txt > output.txt 

即打印列1/2/6在全如果比賽標準得到滿足。

然而這打印1/2/6列的全部內容。

如果例如第6列含有「ID = A08AY; ID2 = 12309A;名稱= TEST」

是否有可能是1個襯墊僅打印「A08AY」而忽略的列的內容的其餘部分?如果是這樣,怎麼樣?

+0

一些樣本輸入數據/預期的輸出可能會有所幫助在這裏。 – Sobrique

回答

1

使用正則表達式來提取ID,將其存儲在一個變量:

perl -lane '($id) = $F[5] =~ /ID=(.*?);/, 
      print "$F[0]\t$F[1]\t$id" 
       if $F[1] > 0 && $F[0] =~ /^A$/ && $F[3] =~ /^A$/' 

*?是「節儉量詞」,它的最短串可能的匹配,thereofre匹配將在第一;結束。

($id)位於括號內強制列表上下文,所以匹配返回捕獲組。

+0

所以這將匹配「ID:」獨立於它的位置/列號? – AnnaSchumann

+0

@AnnaSchumann:我將它固定在第6欄中。 – choroba

+0

謝謝!我想知道你們是怎麼做到這一點的。 – AnnaSchumann

1

如果你想要的位總是在第六列的相同位置,那麼你可以使用split()來獲得$F[5]的相關部分。

$id = (split /;=/, $F[5])[1]; 
1

剛把問題看接受的答案,從而改寫:

perl -lane' 
    next unless $F[1] >0 and $F[0] =~ /^A$/ and $F[3] =~ /^A$/; 
    print "$F[0]\t$F[1]\t$1" if $F[5] =~ /ID=(.*?);/; 
'