Command-Line

如何在linux中加入兩個文件?

  • November 23, 2020

我想在 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>1awk再次跳過第一行。你可能想要這個:

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
   

如果這不是您所看到的,請編輯您的問題並包含一個我們可以實際用來重現錯誤的範例。

引用自:https://unix.stackexchange.com/questions/621116