仅打印列内容的一部分.txt文件

时间:2015-11-20 11:02:25

标签: regex perl text

通常有条件地打印.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 in-full。

然而,这会打印第1/2/6列的全部内容。

例如,如果第6列包含“ID = A08AY; ID2 = 12309A; Name = TEST”

是否可以作为1-liner打印“A08AY”而忽略其余的列内容?如果是这样,怎么样?

3 个答案:

答案 0 :(得分: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$/'

*?是一个“节俭量词”,它匹配可能的最短字符串,因此匹配将在第一个;结束。

($id)位于括号中,强制列表上下文,因此匹配返回捕获组。

答案 1 :(得分:1)

如果您想要的位始终位于第六列中的相同位置,则您可以使用split()获取$F[5]的相关部分。

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

答案 2 :(得分: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=(.*?);/;
'