表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
質問が開いています。