Text-Processing
刪除與另一個文件中的特定標識符匹配的行
我有 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'
解釋
那裡有三個單獨的命令,每個命令()
|
將其輸出傳遞到下一個。前兩個只是通過替換來將每條記錄放在單獨的行\n
上xxx
(這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