Linuxで2つのファイルをリンクする方法は?

Linuxで2つのファイルをリンクする方法は?

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
    

これが表示されていない場合は、質問を編集してエラーを再現するために実際に使用できる例を含めてください。

関連情報