从复杂的行中选择特定列

时间:2016-07-18 16:05:20

标签: perl awk

我有一个包含以下格式的行的文件。我想只保留第一列和包含以下格式的字符串的列 NC_XXXX.1

484-2117    16  gi|9634679|ref|NC_002188.1| 188705  23  21M *   0   0   CGCGTACCAAAAGTAATAATT   IIIIIIIIIIIIIIIIIIIII   AS:i:-6 XN:i:0  XM:i:1  XO:i:0  XG:i:0  NM:i:1  MD:Z:0G20   YT:Z:UU
787-1087    16  gi|21844535|ref|NC_004068.1|    7006    23  20M *   0   0   CTATACAACCTACTACCTCA    IIIIIIIIIIIIIIIIIIII    AS:i:-6 XN:i:0  XM:i:1  XO:i:0  XG:i:0  NM:i:1  MD:Z:19T0   YT:Z:UU
.....
....
...

输出:

484-2117 NC_002188.1
787-1087 NC_004068.1

5 个答案:

答案 0 :(得分:2)

在perl中有类似的东西:

#!/usr/bin/env perl
use strict;
use warnings;

while (<DATA>) {
   my ( $id, $nc ) = m/^([\d\-]+).*(NC_[\d\.]+)/;
   print "$id $nc\n";
}

__DATA__
484-2117    16  gi|9634679|ref|NC_002188.1| 188705  23  21M *   0   0   CGCGTACCAAAAGTAATAATT   IIIIIIIIIIIIIIIIIIIII   AS:i:-6 XN:i:0  XM:i:1  XO:i:0  XG:i:0  NM:i:1  MD:Z:0G20   YT:Z:UU
787-1087    16  gi|21844535|ref|NC_004068.1|    7006    23  20M *   0   0   CTATACAACCTACTACCTCA    IIIIIIIIIIIIIIIIIIII    AS:i:-6 XN:i:0  XM:i:1  XO:i:0  XG:i:0  NM:i:1  MD:Z:19T0   YT:Z:UU

输出:

484-2117 NC_002188.1
787-1087 NC_004068.1

减少到以下单行:

perl -ne 'm/^([\d\-]+).*(NC_[\d\.]+)/ and print "$1 $2\n"'   yourfile

注意 - 这特别匹配由数字和短划线组成的第一列 - 您可以使用更广泛的正则表达式匹配来执行此操作。

答案 1 :(得分:1)

awk救援!

$ awk -F' +|\\|' '{for(i=2;i<=NF;i++) if($i ~ /^NC_[0-9.]+$/) {print $1,$i; next}}' file
484-2117 NC_002188.1
787-1087 NC_004068.1

如果空格是制表符char,则需要添加到分隔符列表

$ awk -F' +|\\||\t' ...

答案 2 :(得分:0)

使用下面的gnu-awk可能是解决方案:

awk '{printf "%s %s\n",$1,gensub(/.*(NC_.*\.1).*/,"\\1",1,$0)}' file

<强>输出

484-2117 NC_002188.1
787-1087 NC_004068.1

更具限制性的版本是

awk '{printf "%s %s\n",$1,gensub(/.*(NC_[[:digit:]]*\.1).*/,"\\1",1,$0)}' file

答案 3 :(得分:0)

使用perl:

perl -anE'say "$F[0] ",(split /\|/, $F[2])[3]' file

或awk:

awk -F'\\|| +' '{print $1,$6}' file

答案 4 :(得分:0)

awk -F'[ |]' '{print $1,$10}' file
484-2117 NC_002188.1
787-1087 NC_004068.1