Command-Line
如何在linux中加入兩個文件?
我想在 Linux 機器上加入兩個文件。我想加入僅包含在第一個文件中的行。
第一個文件是解壓縮文件(沒有標題,只有一列)。
1_4 3_4 4_63 6_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
輸出文件不僅包括第一個文件中包含的行。有人知道出了什麼問題嗎?
提前致謝!
您有一個錯誤,這意味著您將錯過 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_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
如果這不是您所看到的,請編輯您的問題並包含一個我們可以實際用來重現錯誤的範例。