2015-11-20 25 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=(.*?);/; 
'