0

ここでのプログラミング初心者は、AWKスクリプトを条件付きに変更するための支援が必要です。代替の非awkソリューションも大歓迎です。

メインフィルタリングは、Bireiの支援のおかげで機能していますが、追加の問題があります。詳細については、以下の注を参照してください。

次のような3列の一連の入力ファイルがあります。

chr4    190499999   190999999
chr6    61999999    62499999
chr1    145499999   145999999

これらの行を使用して別のファイル(refGene.txt)をフィルタリングし、ファイル1の行がrefGene.txtの行を計算する場合、refGene.txtの列13を新しいファイル'ListofGenes_$f'に出力します。私にとってトリッキーな部分は、列1(たとえば、'chr4'、'chr6'、'chr1')と列2および/または列3がrefGeneの同等の列と一致する限り、一致としてカウントすることです。 txtファイル。2つのファイル間の同等の列は、$ 1 = $ 3、$ 2 = $ 5、$ 3 =$6です。次に、awkで、refGene.txtから行全体を出力せず、列13のみを出力する方法がわかりません。

Bireiの助けを借りて、上記の条件付きフィルタリングを実現しました。次に、追加のフィルター条件を組み込む必要があります。また、値$2と$3の間の領域のいずれかがrefGene.txtファイルの$5と$6の間の領域と重複する場合は、refGene.txtファイルから列$13を出力する必要があります。これは、領域が重なっているかどうかを確認するための数学的な計算を伴うため、非常に難しいようです。

これまでの私のスクリプト:

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

1

一方通行。

awk '
    BEGIN { FS = "\t"; }

    ## Save third, fifth and seventh field of first file in arguments (refGene.txt) as the key
    ## to compare later. As value the field to print.
    FNR == NR {
        pair[ $3, $5, $6 ] = $13;
        next;
    }

    ## Set the name of the output file.
    FNR == 1 {
        output_file = "";
        split( ARGV[ARGIND], path, /\// );
        for ( i = 1; i < length( path ); i++ ) {
            current_file = ( output_file ? "/" : "" ) path[i];
        }
        output_file = output_file "/ListOfGenes_" path[i];
    }

    ## If $1 = $3, $2 = $5 and $3 = $6, print $13 to output file.
    {
        if ( pair[ $1, $2, $3 ] ) {
            print pair[ $1, $2, $3 ] >output_file;
        }
    }
' refGene.txt /files/rubal/*.txt
于 2012-10-04T12:50:07.127 に答える