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処理が難しい場合があります。ファイルがソートされていない場合でも文句を表示します。

答え2

やってみました…?

join -o 2.3,1.5 f1 <(zcat f2.gz )

デフォルトでは、join最初のフィールドが使用されます。 (およびと-1 x -2 x同じで、-j x-j 1同じです" "

私は仮定する

  • ファイルがソートされており、
  • キーは最初のフィールドだけです。

すべてのフィールドを並べ替える

join -o 2.2,1.2 \
    <(awk '{printf "%s %s\n",$1 $2 $3 $4,$5}' f1) \
    <(zcat f2.gz| awk '{printf "%s %s\n",$1 $2 $4 $5,$3}' )

どこ

  • 2つのawkパイプを使用することはjoinおそらく良いアイデアではありません(ただし、awk唯一のソリューションと比較してメモリを節約できますが)。
  • awkコマンドは関連フィールドに索引を作成します。
  • zcat減圧のため、
  • これで0質問が開いています。

関連情報