Linuxシステムで2つのファイルを結合したいです。最初のファイルに含まれる行だけを結合したいと思います。
最初のファイルは解凍されたファイルです(ヘッダーなし、1列しかありません)。
1_4
3_4
4_63
6_2
2番目のファイルはgzファイルです(ヘッダー、16列を含む)。
CHR POS rsid SNPID Allele1 Allele2 AC_Allele2 AF_Allele2 imputationInfo N BETA SE Tstat p.value p.value.NA Is.SPA.converge
1 4 78 42 850 284 102 478 199 3777 485 2.5 2.4 23 35 336
8 3 74 24 0 2485 21 48 9 77 85 0.5 5.4 42 4312 335
many more lines
私は次を試しました。
join -11 -21 <(cat file1 | sort -k1,1) <(zcat file2.gz | sed 1,1d | awk 'NR>1{print $1"_"$2,$1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16}' | sort -k1,1) | awk '{print $1,$2,$3,$6,$5,$9+$10,$8,$11,$12,$7}' > outfile
出力ファイルには、最初のファイルに含まれる行だけが含まれるわけではありません。何が間違っているのか知っている人はいますか?
よろしくお願いします!
答え1
file2 の最初の行が欠落していることを意味するエラーが発生しました。sed 1,1d
最初の行またはヘッダーを削除するか、最初の行を再度NR>1
スキップできます。awk
あなたはおそらくこれが欲しいでしょう:
join -11 -21 <(cat file1 | sort -k1,1) \
<(zcat file2.gz | awk 'NR>1{print $1"_"$2,$1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16}' | sort -k1,1) |
awk '{print $1,$2,$3,$6,$5,$9+$10,$8,$11,$12,$7}'
つまり、他のすべては説明どおりに進む必要があります。次のサンプルファイルを使用してテストしました。
$ cat file1
1_4
3_4
4_63
6_2
そして
$ zcat file2
CHR POS rsid SNPID Allele1 Allele2 AC_Allele2 AF_Allele2 imputationInfo N BETA SE Tstat p.value p.value.NA Is.SPA.converge
1 4 78 42 850 284 102 478 199 3777 485 2.5 2.4 23 35 336
1 8 78 42 850 284 102 478 199 3777 485 2.5 2.4 23 35 336
そして予想通り、1行の出力のみが表示されます1_4
。
$ join -11 -21 <(cat file1 | sort -k1,1) \
<(zcat file2.gz | awk 'NR>1{print $1"_"$2,$1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16}' |
sort -k1,1) |
awk '{print $1,$2,$3,$6,$5,$9+$10,$8,$11,$12,$7}'
1_4 1 4 850 42 677 102 3777 485 284
これが表示されていない場合は、質問を編集してエラーを再現するために実際に使用できる例を含めてください。