互いに隣接する染色体に基づいてソートされたファイルデータのマージ - カラム万力

互いに隣接する染色体に基づいてソートされたファイルデータのマージ - カラム万力

chr position value 形式のファイルが複数あります。

「chr」、「position」、「samp1」、「samp2」、「samp3」、「samp4」の形式に変換したいと思います。

たとえば、

サンプル1:

chr position value
1   3774318 1
1   3774319 1
1   3775200 2
1   3775201 7
1   3775202 70
1   3775203 7
1   3775204 270
1   3775205 3
1   3775206 5

サンプル2:

chr position value
1   3775200 1
1   3775201 1
1   3775202 10
1   3775203 1
1   3775204 12
1   3775205 1
1   3775206 13
1   3775207 1
1   3775208 1
1   3775209 18

(など...)

目的の出力ファイル:/出力ファイルに任意の値を入れました。

chr, position, value-samp1, value-samp2, value-samp3, value-samp4 
1 50204 2 17 5 2
1 50205 2 17 5 2
1 50206 2 18 5 2
1 50207 2 19 5 3
1 50208 3 19 5 3
1 50209 3 19 5 3

Join、merge、catを試しましたが、期待どおりに動作しませんでした。私は初心者です。これをどのように実行できるのかというアイデアはありますか?

(編集者注:あなたが提供した実際のデータを使用して説明した作業の例です。)

chr position    samp1   samp2
1   3774318     1       0
1   3774319     1       0
1   3775200     2       1
1   3775201     0       1
1   3775202     70      10
1   3775203     7       1
1   3775204     270     12
1   3775205     3       1
1   3775206     5       13
1   3775207     7       1
1   3775208     0       1
1   3775209     0       18

ベストアンサー1

別のawk方法。NA入力ファイルの1つに特定のバリエーションが存在しない場合は、このファイルが印刷されます。

awk '{ if(FNR==1){files[fnum++]=FILENAME}else{var[$1"\t"$2][FILENAME]=$3}} END{ for(v in var){for(file in files){if(! var[v][files[file]]){var[v][files[file]]="NA"}}}printf "chr\tposition "; for(i=1;i<=fnum;i++){printf "value-samp%s\t",i;} print "";for(v in var){ printf "%s ",v; for(file in var[v]){if(file in var[v]); else{var[v][file]="NA";}  printf "%s\t", var[v][file] } print ""}}' s1 s2

または簡潔さがあまり好きではない場合:

awk '{ 
        if(FNR==1){
            files[fnum++]=FILENAME
        }
        else{
            var[$1"\t"$2][FILENAME]=$3
        }
      } 
      END{ 
        for(v in var){
            for(file in files){
                if(! var[v][files[file]]){
                    var[v][files[file]]="NA"
                }
            }
        }
        printf "chr\tposition "; 
        for(i=1;i<=fnum;i++){
            printf "value-samp%s\t",i;
        } 
        print "";
        for(v in var){ 
            printf "%s ",v; 
            for(file in var[v]){
                if(file in var[v]); 
                else{
                    var[v][file]="NA";
                }
            printf "%s\t", var[v][file];
        } 
    print "";
    }
}' s1 s2

s1とをs2使用している実際のファイル名に変更します。サンプル入力で上記のコマンドを実行すると、以下が返されます。

chr position value-samp1    value-samp2 
1   3774318 1   NA  
1   3775200 2   1   
1   3774319 1   NA  
1   3775201 7   1   
1   3775202 70  10  
1   3775203 7   1   
1   3775204 270 12  
1   3775205 3   1   
1   3775206 5   13  
1   3775207 NA  1   
1   3775208 NA  1   
1   3775209 NA  18  

おすすめ記事