3つのファイルの情報を組み合わせて4番目のファイルを作成するには?

3つのファイルの情報を組み合わせて4番目のファイルを作成するには?

3つのcsvファイルがあり、各ファイルには4番目のファイルを取得するために必要な情報が含まれています。私はおもちゃのファイルを説明していますが、実際のファイルにはまだ同じモデルに多くの列と行が含まれています。

ファイル1は元のデータファイルです。 「individual」には、各「rs」ごとに1文字があります。例えば。 personal0にはrs009に「A」があり、rs888に「T」があります。 :

        Individual0 Individual1 Individual2 Individual3
rs009   A       T       A       A
rs888   T       T       T       T
rs103   C       C       C       C
rs591   A       A       A       A
rs112   A       A       A       A
rs004   C       C       C       C

ファイル2は、「グループ」の「rs」変数を集計します。各「グループ」は、ファイル1の順序で並べられた連続した「rs」変数の組み合わせです。たとえば、rs009 と rs103 は「Group0」という変数にクラスタリングされます。 「Group0」が終了して「Group1」が起動した場合は、「Group」を持つことはできません。重要なのは、この段階でいくつかの「rs」変数がフィルタリングされることです(例:rs888)。

Group0 rs009 rs103
Group1 rs591 rs112 rs004

ファイル3は、各「グループ」変数が各「人」に番号を割り当てる結果ファイルです。たとえば、Individual2のGroup0には3があり、Group1には2があります。

        Individual0 Individual1 Individual2 Individual3
Group0  1       3       3       3
Group1  3       3       2       3

私が取得したいファイルはファイル1に似ていますが、ファイル3の特定の「person」に対して「group」=3に属していないすべての「rs」変数は0に設定され、他のファイルはその情報を保持します。たとえば、rs009はGroup0に属し(ファイル2を参照)、ファイル3はGroup0に「1」があることを個人0に通知します。これは、ファイル1に記載されている文字を0に変更する必要があることを意味します。これとは対照的に、Individual1の場合、File 3はGroup0に「3」があることを示すため、File1の文字(つまり「T」)は維持する必要があります。フィルタリングされた「rs」変数は、リスト内の前の変数と同じ番号を持ちます(つまり、rs888はrs009と同じ「グループ」割り当てを持ちます)。

        Individual0 Individual1 Individual2 Individual3
rs009   0       T       A       A
rs888   0       T       T       T
rs103   0       C       C       C
rs591   A       A       0       A
rs112   A       A       0       A
rs004   C       C       0       C

つまり、次のものが必要です。

1)ファイル1のインポート

2)ファイル2の「rs」がどの「グループ」に属しているかを確認します。 File2 に 'rs' がない場合は、File1 の順序に従って以前の 'rs' と同じ「グループ」に属します。

3)ファイル3の各「人」の各「グループ」に割り当てられた値を取得します。

4)後者の値が「3」の場合、ファイル1の各「individual」に割り当てられた文字(A / C / G / T)を保持し、そうでない場合は「0」に変更します。

私はawkを使っていくつかのオプションを試しましたが、知識はかなり制限されており、最終的に必要なものを得る方法を見つけることができませんでした。今回が最初の投稿なので、十分な情報を提供できることを願っています。 Perlスクリプトを実行できますが、作成することはできません。助けてくれてありがとう!

答え1

さて、これはハッキングですが、とにかく:

このグループを次の中間ファイルとして使用し、解析してみましょうfile3file2resolved

awk '
    FNR == NR {
        group = $1
        $1 = ""
        groups[group] = $0
    }
    FNR != NR {
        for (i = 2; i <= NF; i++) {
            print $i" "groups[$1]
        }
    }
' <(tail -n+2 file3) file2 > resolved

到着する:

$ cat resolved
rs009  1 3 3 3
rs103  1 3 3 3
rs591  3 3 2 3
rs112  3 3 2 3
rs004  3 3 2 3

次に、resolved次のように使用しますfile1

awk '
    FNR == NR {
        group = $1;
        for (i = 2; i <= NF; i++) {
            groups[group][i] = $i
        }
    }
    FNR != NR {
        if ($1 in groups) {
            group = $1
        }
        for (i = 2; i <= NF; i++) {
            if (groups[group][i] != 3) {
                $i = 0
            }
        }
        print
    }

' resolved <(tail -n+2 file1)

次を生成します。

rs009 0 T A A
rs888 0 T T T
rs103 0 C C C
rs591 A A 0 A
rs112 A A 0 A
rs004 C C 0 C

ヘッダーを活用しcolumnて再度追加します。

関連情報