Text-Processing

基於公共列合併兩個文件;為文件 2 中不存在的變體添加 0,並在存在的變體中保留原始值

  • March 5, 2021

我想合併兩個共享一些通用數據的文件。文件 1 包含的內容多於文件 2。我想按照文件 1 的順序根據它們的共享列 (3) 合併文件,並且當文件 2 中不存在變數時,我想將 0 添加到列 5 (AN1),如果存在,添加 AN1 的原始值(0 或 1)。

我的文件如下所示: 文件 1

CHR BP  SNP CM  base
20  61098   rs6078030   -0.00024510777  1
20  61795   rs4814683   0   1
20  63231   rs6076506   0.0005026053    1
20  63244   rs6139074   0.00050714752   1

文件 2

CHR BP  SNP CM  AN1
20 9836704 rs221007 0 1
20 9817032 rs221011 0 0
20 9764069 rs2206484 0 0
20 9639395 rs4816159 0 1

我想根據第 3 列(SNP)匹配它們。我想暫時保留所有其他列。

我想要的輸出看起來像這樣(當 rsX 不存在時為 0,或者當 AN1 的原始值為 0 時):

文件 3

CHR BP  SNP CM  base AN1
20  61098   rs6078030   -0.00024510777  1   1
20  61795   rs4814683   0   1   0
20  63231   rs6076506   0.0005026053    1   0
20  63244   rs6139074   0.00050714752   1   1

我需要根據新的條件修改這段程式碼:

awk 'NR==FNR{ snp[$3]; next }
{ $6=($3 in snp)?(FNR==1?"AN1":"1"):"0" }1' file2 file1

在這裡,當文件 1 中存在 rsX 時,我列印 1。我想列印 AN1 的原始值(0 或 1)

awk 'NR==FNR{ snp[$3]=$NF; next }
{ $6=($3 in snp)?(FNR==1?"AN1":snp[$3]):"0" }1' file2 file1

裡面的東西awk

NR:到目前為止看到的輸入記錄總數。

FNR:目前輸入文件中的輸入記錄號,下一個輸入文件時會重置為 1。

因此,僅第一個輸入文件的條件NR==FNR將始終為真,並且NR==FNR { ... }當它為真時將執行以下塊,並且我們將最後一列值保存$NF到以列為鍵的awk數組snp``$3

next語句導致awk跳過執行其餘程式碼並重新開始,如果NF==FNR仍然為真,它將重複處理該塊,直到讀取第一個輸入文件的所有記錄/行。

然後在下一個塊中,我們$6使用以下條件添加/更新列的值:

  • 如果 file1 中的 column#3 設置在snpfile2 的數組中,則執行以下操作:

    • 如果它是第一行,則將其值設置為*AN1*
    • 如果不是第一行,則將其值設置為從*snp[$3]*數組中讀取的值。
  • 否則設置為*0*.

畢竟用於列印結果的awk idom 。1

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