2

これは、以前の質問Awk 条件付きフィルター 1 つのファイルを別のファイル (または他のソリューション) に基づいて構築しています。

質問の下部にある簡単な要約

その行の値が別のテキスト ファイルの 3 つの値のうち 2 つと一致する場合、テキスト ファイル 'refGene.txt の行から列を出力する awk プログラムがあります。

2 つのファイル間の一致を見つけるための追加の条件を含める必要があります。ファイル 1 の各行で指定された 2 つの数値の範囲が、refGene.txt の行の 2 つの値の範囲と重複する場合、基準は包含です。ファイル 1 の行の例:

chr1 10 20
chr2 10 20

一致する列 ($3、$5、$ 6) のファイル 2 (refGene.txt) の行の例:

chr1 5 30

現在、awk プログラムはこれを一致として扱いません。最初の列は一致しますが、2 番目または 3 番目の列は一致しないためです。しかし、ファイル 1 の領域 10 ~ 20 は refGene.txt の 5 ~ 30 の範囲内にあるため、これを一致として扱う方法が必要です。ただし、最初の列が一致しないため、ファイル 1 の 2 行目は一致しないはずです。これは必要なことです。ファイル 1 の範囲のいずれかが refGene.txt の範囲のいずれかと重複するケースを含める方法があれば、非常に役立ちます (したがって、部分的な重複も一致としてカウントされます)。また、現在以下で説明されているすべてのケースも検出されるため、以下の条件文を置き換える必要があります。

要約: 次の場合に awk に一致を出力させたい: file1 の $1 が file 2 の $3 と一致する AND: file1 の $2-$3 の範囲が file2 の $5-$6 の範囲とまったく交差する

私の質問が不明な場合はお知らせください。どんな助けでも本当に感謝しています。(ソリューションは awk である必要はありません)

ルバル

FILES=/files/*txt   
for f in $FILES ;
do

    awk '
        BEGIN {
            FS = "\t";
        }
        FILENAME == ARGV[1] {
            pair[ $1, $2, $3 ] = 1;
            next;
        }
        {
            if ( pair[ $3, $5, $6 ] == 1 ) {
                print $13;
            }
        }
    ' $(basename $f) /files/refGene.txt > /files/results/$(basename $f) ;
done
4

1 に答える 1

0

2 つの配列を使用するだけです。

awk -F '\t' '
  NR == FNR {min[$1] = $2; max[$1] = $3; next}
  ($3 in min) && (min[$3] >= $5) && (max[$3] <= $6) {print $13}
'

NR==FNRFILENAME == ARGV[1]ファイル名の代わりに行番号を見ます。

于 2012-10-04T16:47:44.170 に答える