Text-Processing

刪除與另一個文件中的特定標識符匹配的行

  • November 25, 2018

我有 2 個文件。文件 1 有一個標識符(例如D7MHBF:11:1449:1988),每個新條目都以@. 它還有幾個欄位,這在我們的分析中並不重要。

文件 2 由一列標識符組成。如果文件 2 的標識符與文件 1 的標識符完全匹配,則刪除文件 1 中的整個三行條目。(PS 每個條目以 @ 開頭)。 文件 1

@D7MHBF:11:1449:1988  1:N
NGCCCATTCTATGCAACAAATTCAACAAAGTCTCCCA
+
#1=DDFFDFHHDHIGGFIIIIIIIHHIHIGDGIGGEH
@D7MHBF:11:1681:1959  1:N
NGGTTTAGAGCCTGTATTTTGAACGTAATAGCAGGGT
+
#1=ADDFFHHDDHEHIHJJJICCFHGEIGJGGGIJJF
@D7MHBF:11:1778:1946  1:N
NTGTGGGTTCAACAATGGGCTCATTGCCATCAGCGAG
+
#1=ADDFDHHGHFHGGIIJJJGIIJIFIIJJJIJIIJ
@D7MHBF:11:1854:1955  1:N
NTTGATTGTGCTTCTTATGAGCAAAAATGTTGATGAC
+
#1=DFFFFHHHGHHIJEHIIGGGGIJJJJIHIIHIII
@D7MHBF:11:1903:1972  1:N
NACTACTATACTATGAAGTGGCTATGACAATTGTCTT
+
#1=DFFFFHHHGHHIJEHIIIGGGGIJJJJIHIIHII

文件 2:

D7MHBF:11:1449:1988
D7MHBF:11:13844:51576
D7MHBF:11:13838:51641
D7MHBF:11:1778:1946
D7MHBF:11:1903:1972                                                                                                                                                                                                                                                                                                                                                                                                    

預期輸出:

@D7MHBF:11:1681:1959  1:N
NGGTTTAGAGCCTGTATTTTGAACGTAATAGCAGGGT
+
#1=ADDFFHHDDHEHIHJJJICCFHGEIGJGGGIJJF
@D7MHBF:11:1854:1955  1:N
NTTGATTGTGCTTCTTATGAGCAAAAATGTTGATGAC
+
#1=DFFFFHHHGHHIJEHIIGGGGIJJJJIHIIHIII

這是一種解決方案(複製/粘貼到您的終端):

perl -pe 's/\n/xxx/g' file1 | sed 's/xxx@/\n@/g; s/xxx$/\n/' |
grep -vFf file2 | sed 's/xxx/\n/g'

解釋

那裡有三個單獨的命令,每個命令|將其輸出傳遞到下一個。前兩個只是通過替換來將每條記錄放在單獨的行\nxxx(這xxx只是為了讓我們知道換行符在哪裡)。如果您單獨執行它們,它們會:

$ perl -pe 's/\n/xxx/g' file1 | sed 's/xxx@/\n@/g; s/xxx$/\n/'
@D7MHBF:11:1449:1988  1:NxxxNGCCCATTCTATGCAACAAATTCAACAAAGTCTCCCAxxx+xxx#1=DDFFDFHHDHIGGFIIIIIIIHHIHIGDGIGGEH
@D7MHBF:11:1681:1959  1:NxxxNGGTTTAGAGCCTGTATTTTGAACGTAATAGCAGGGTxxx+xxx#1=ADDFFHHDDHEHIHJJJICCFHGEIGJGGGIJJF
@D7MHBF:11:1778:1946  1:NxxxNTGTGGGTTCAACAATGGGCTCATTGCCATCAGCGAGxxx+xxx#1=ADDFDHHGHFHGGIIJJJGIIJIFIIJJJIJIIJ
@D7MHBF:11:1854:1955  1:NxxxNTTGATTGTGCTTCTTATGAGCAAAAATGTTGATGACxxx+xxx#1=DFFFFHHHGHHIJEHIIGGGGIJJJJIHIIHIII
@D7MHBF:11:1903:1972  1:NxxxNACTACTATACTATGAAGTGGCTATGACAATTGTCTTxxx+xxx#1=DFFFFHHHGHHIJEHIIIGGGGIJJJJIHIIHII

如您所見,現在每個條目都在自己的行上。因此,您現在可以將它傳遞給grep並告訴它列印所有( -v) 匹配 file2 ( -f file2) 中找到的任何模式的行。這列印:

$ perl -pe 's/\n/xxx/g' file1 | sed 's/xxx@/\n@/g; s/xxx$/\n/' | grep -vFf file2  
@D7MHBF:11:1681:1959  1:NxxxNGGTTTAGAGCCTGTATTTTGAACGTAATAGCAGGGTxxx+xxx#1=ADDFFHHDDHEHIHJJJICCFHGEIGJGGGIJJF
@D7MHBF:11:1854:1955  1:NxxxNTTGATTGTGCTTCTTATGAGCAAAAATGTTGATGACxxx+xxx#1=DFFFFHHHGHHIJEHIIGGGGIJJJJIHIIHIII

最後,我們再次執行它sed,用換行符替換xxx並獲得所需的輸出:

$ perl -pe 's/\n/xxx/g' file1 | sed 's/xxx@/\n@/g; s/xxx$/\n/' | 
   grep -vFf file2  | sed 's/xxx/\n/g' 
@D7MHBF:11:1681:1959  1:N
NGGTTTAGAGCCTGTATTTTGAACGTAATAGCAGGGT
+
#1=ADDFFHHDDHEHIHJJJICCFHGEIGJGGGIJJF
@D7MHBF:11:1854:1955  1:N
NTTGATTGTGCTTCTTATGAGCAAAAATGTTGATGAC
+
#1=DFFFFHHHGHHIJEHIIGGGGIJJJJIHIIHIII

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