2

我有这个文件

427 A   C   A/C 12
436 G   C   G/C 12
445 C   T   C/T 12
447 A   G   A/G 9
451 T   C   T/C 5
456 A   G   A/G 12
493 G   A   G/A 12

我想阅读第一列并找到所有其他差异小于 10 的 id。

427 A   C   A/C 12  436
436 G   C   G/C 12  427,445
445 C   T   C/T 12  436,447,451
447 A   G   A/G 9   445,451,456
451 T   C   T/C 5   445,447,456
456 A   G   A/G 12  451,447
493 G   A   G/A 12

最后一列应该和上面一样。与该特定 id 相距 + 或 - 10 个碱基的所有 id。例如对于 436,边界是 {426 - 446} 在该范围内的其他 id 是 427 和 445,所以我将它们显示在第 6 列中。

4

2 回答 2

3

这是使用 Perl 的一种方法:

use strict;
use warnings;

open my $fh, '<', 'dataFile.txt' or die $!;
chomp( my @data = <$fh> );
close $fh;

my @IDs = map /(\d+)/, @data;

for (@data) {
    my ($id) = /(\d+)/;
    print "$_\t"
      . ( join ',', grep { abs $id - $_  < 11 and $id != $_ } @IDs )
      . "\n";
}

输出:

427 A   C   A/C 12  436
436 G   C   G/C 12  427,445
445 C   T   C/T 12  436,447,451
447 A   G   A/G 9   445,451,456
451 T   C   T/C 5   445,447,456
456 A   G   A/G 12  447,451
493 G   A   G/A 12  
于 2012-10-30T02:32:00.783 回答
2

这是使用GNU awk. 像这样运行:

awk -f script.awk file.txt{,} | column -t

内容script.awk

FNR==NR {
    array[$1]++
    next
}

{
    n = asorti(array,sort)

    for (i=1; i<=n; i++) {

        if (sort[i] <= $1 + 10 && sort[i] >= $1 - 10 && $1 != sort[i]) {
            line = (line ? line "," : line) sort[i]
        }
    }

    print $0, line

    line = ""
}

结果:

427  A  C  A/C  12  436
436  G  C  G/C  12  427,445
445  C  T  C/T  12  436,447,451
447  A  G  A/G  9   445,451,456
451  T  C  T/C  5   445,447,456
456  A  G  A/G  12  447,451
493  G  A  G/A  12

或者,这是单线:

awk 'FNR==NR { array[$1]++; next } { n = asorti(array,sort); for (i=1; i<=n; i++) if (sort[i] <= $1 + 10 && sort[i] >= $1 - 10 && $1 != sort[i]) line = (line ? line "," : line) sort[i]; print $0, line; line = "" }' file.txt{,} | column -t
于 2012-10-30T01:05:31.587 回答