1

これら2つのデータセットを結合するためにawkコマンドを使用しようとしています。fileA.$1 と fileB.$1 が同じで、fileA.$4 と fileA.$5 の平均が fileB.$2 と fileB.$3 の間にあるすべての行を取得したいと思います。(fileA.$1=fileB.$1 AND fileB.$2 < average(fileA.$4+fileA.$5) < fileB.$3)。誰でもこれに線を引くことができますか?

fileA                           
chr1    Mot TF  500 700 0.9893  target1 600
chr1    Mot TF  100 300 0.9893  target1 200
chr1    Mot TF  1000    2000    0.9893  target1 1500
chr2    Mot TF  500 700 0.9502  target2 600

fileB       
chr1    500 1000
chr1    400 800
chr1    100 800
chr3    100 500

desired result                              
chr1    500 1000    chr1    Mot TF  500 700 0.9893  target1 600
chr1    400 800 chr1    Mot TF  500 700 0.9893  target1 600
chr1    100 800 chr1    Mot TF  500 700 0.9893  target1 600
chr1    100 800 chr1    Mot TF  100 300 0.9893  target1 200
4

2 に答える 2

1
#!/usr/bin/awk -f

BEGIN {
    FS = OFS = "\t"
}
NR == FNR {
    a0[NR] = $0
    a1[NR] = $1
    av[NR] = ($4 + $5) / 2
    next
}
{
    for (i = 1; i in a0; ++i) {
        if (a1[i] == $1 && av[i] > $2 && av[i] < $3) {
            print $0, a0[i]
        }
    }
}

実行:

awk -f script.awk fileA fileB

出力:

chr1    500 1000    chr1    Mot TF  500 700 0.9893  target1 600
chr1    400 800 chr1    Mot TF  500 700 0.9893  target1 600
chr1    100 800 chr1    Mot TF  500 700 0.9893  target1 600
chr1    100 800 chr1    Mot TF  100 300 0.9893  target1 200
于 2013-09-20T19:53:53.040 に答える
0

出力形式に柔軟に対応できる場合:

join fileB fileA | awk '$2 < $NF && $NF < $3' 
chr1 500 1000 Mot TF 500 700 0.9893 target1 600
chr1 400 800 Mot TF 500 700 0.9893 target1 600
chr1 100 800 Mot TF 500 700 0.9893 target1 600
chr1 100 800 Mot TF 100 300 0.9893 target1 200

join結合列を 2 回出力しません。fileA の最後のフィールドはすでに平均値になっていると仮定します。

さもないと

awk -v OFS='\t' '
    NR==FNR {f1[$0] = $1; min[$0] = $2; max[$0] = $3; next}
    {
        avg=($4+$5)/2
        for (b in f1) {
            if ($1 == f1[b] && min[b] < avg && avg < max[b]) {
                print b, $0
            }
        }
    }
' fileB fileA
chr1    100 800 chr1    Mot TF  500 700 0.9893  target1 600
chr1    500 1000    chr1    Mot TF  500 700 0.9893  target1 600
chr1    400 800 chr1    Mot TF  500 700 0.9893  target1 600
chr1    100 800 chr1    Mot TF  100 300 0.9893  target1 200
于 2013-09-20T21:30:47.820 に答える