ビッグデータ行列から特定の値を抽出する

ビッグデータ行列から特定の値を抽出する

最初の行に変数名が含まれ、最初の列にオブジェクト名が含まれる大きな行列があります(変数とオブジェクトは同じで、両方と全体を比較します)。また、2つの異なるテキストファイルがあります。最初の(file1.txt)には関心のあるオブジェクトが含まれており(マトリックスの最初の列に報告されたオブジェクト名に基づいて関心のある行を選択するにはこのファイルを使用する必要があります)、2番目のファイル(list.txt)には短いオブジェクトのリストが含まれていますあります。このリストは、リストに報告されたオブジェクト名で始まるマトリックスの関連列を選択するために使用する必要があります。目的は、これら2つのtxtファイルを使用して行列の相対スコアを抽出することです。

たとえば、Matrix.txt:(タブで区切られた列)

Object  3mup_A_001_____ 3oz1_A_001_____ 456r_V_002_____ 23er_B_001_____ 87t5_C_001_____
23er_B_001_____ 0.5     0.3     0.87    1       0.9
456r_V_002_____ 0.2     0.7     0.65    0.63    0.2
87t5_C_001_____ 0.35    0.5     0.254   0.12    1
dret_A_009_____ 0.99    0.88    0.7     0.89    0.214
3mup_A_001_____ 0.12    0.15    0.87    0.17    0.87

ファイル1.txt:

87t5_C_001_____

リスト.txt:

3mup_A_001_____
456r_V_002_____

(87t5_C_001____)を使用して、file1.txt最初の列(選択行列の4行目)で目的のオブジェクトを選択し、ファイルに含まれるオブジェクト名で始まる列(変数)に関連するスコアを取得する必要がありますlist.txt

出力.txt

Object  3mup_A_001_____ 456r_V_002_____
87t5_C_001_____ 0.35    0.254   

あるいは、より単純な場合は、出力はリスト内のオブジェクトの近くにあるスコアを報告するなどの他の形式にすることもできます。

3mup_A_001_____ 0.35
456r_V_002_____ 0.254

これを行う方法がわからないので、誰かが私を助けることができることを願っています。

ありがとうございます。

ベストアンサー1

$ cat tst.awk
BEGIN { FS=OFS="\t" }
FILENAME == ARGV[1] {
    rowNames[$1]
    next
}
FILENAME == ARGV[2] {
    colNames[$1]
    next
}
FNR == 1 {
    rowNames[$1]
    colNames[$1]
    for (i=1; i<=NF; i++) {
        if ($i in colNames) {
            f[++numCols] = i
        }
    }
}
$1 in rowNames {
    for (colNr=1; colNr<=numCols; colNr++) {
        printf "%s%s", $(f[colNr]), (colNr<numCols ? OFS : ORS)
    }
}

$ awk -f tst.awk file1.txt list.txt matrix.txt
Object  3mup_A_001_____ 456r_V_002_____
87t5_C_001_____ 0.35    0.254

おすすめ記事