通常有条件地打印.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”而忽略其余的列内容?如果是这样,怎么样?
答案 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=(.*?);/;
'