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 を使用する 1 つの方法を次に示します。

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

を使用する 1 つの方法を次に示し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 に答える