Join / awkを使用してあるテーブルから値を見つけて別のテーブルに出力する

Join / awkを使用してあるテーブルから値を見つけて別のテーブルに出力する

表1(タブ区切り):

NC_000001.11 1243 A T 0.14 
NC_000005.11 1432 G C 0.0006 
NC_000012.12 1284 A T 0.93428 
NC_000021.9 9824 T C 0.9

ルックアップテーブル(タブで区切られています) - 実際にはgzipから約6Gまでかなり大きいです。

 NC_000001.11 1243 rs73647921 A   T  
 NC_000005.11 1432 rs75444    G   C
 NC_000012.12 1284 rs754723 A T  
 NC_000021.9 9824 rs865545  T C 

照会テーブルの列1/2/4/5に対応する表1の最初の4列に一致する出力が必要です。

MarkerName P-Value
rs73647921 0.14
rs75444    0.0006
rs754723 0.93428 
rs865545  0.9

次のようにJoinを使用する必要があると思います。

join -t, -a 1 -a 2 -o0,1.5,2.3 -e ' -' file1 file2

しかし、これはうまくいかないようです。 gzipを使用してファイルをどのように圧縮できますか?

ベストアンサー1

awk(とbash)を使って書くことができます

awk '
    BEGIN {FS = OFS = "\t"}
    NR == FNR {pvalue[$1,$2,$3,$4] = $5; next}
    FNR == 1 {print "MarkerName", "P-Value"}
    { key = $1 SUBSEP $2 SUBSEP $4 SUBSEP $5
      sub(/\r$/, "", key)
    }
    key in pvalue {print $3, pvalue[key]}
' table1.tsv <(zcat lookup.tsv.gz)

awkはSUBSEP変数を使用して、コンマで区切られた配列インデックスを連結します。

zcatの最後の構文はbashです。プロセスの交換

マルチフィールド結合条件の場合、join処理が難しい場合があります。ファイルがソートされていない場合でも文句を表示します。

おすすめ記事