Удалить определенную часть файла в зависимости от другого файла в Bash - PullRequest
0 голосов
/ 10 октября 2019

Я ищу команду bash, чтобы удалить часть текста, если текст после ">" присутствует в file1 и file2.

Вот пример

File1:

CUI02270
CUI02272
CUI02271
CUI02290
CUI02289
CUI022799


File2:

>CUI02270 |hypothetical protein pCPXV0248[Cowpox virus]
MGTVFVPYLLVKLALRVLVISNGYCHVPLKYIVLMIAHRVLLSSIVESTTLDIPDLRSTM
ELILLTASRLKFNLYRPNL
>CUI02271 |CPXV043 protein[Cowpox virus]
MLAFCYSLPNVGDVLKGKVYENGYALYIDLFDYPHSEAILAESVQMHMNRYFKYRDKLVG
KTVKVKVIRVDYTKGYIDVNYKRMCKHQ
>CUI02272 |hypothetical protein pCPXV0245[Cowpox virus]
MFTHPFVIDIYISFCIINSNHFNFYSFPYQFIPIFKISIHMHLNTLCQDSFRVRIVKKIN
V
>CUI02273 |CPXV044 protein[Cowpox virus]
MNPDNTIAVITETIPIGMQFDKVYLSTFNVWREILSNTTKTLDISSFYWSLLDEVGTNFG
TTILNEIVQLPKRGVRVRVAVNKSNKPLKDVETLQMAGVEVRYIDITNILGGVLHTKFWI
SDNTHIYLGSANMDWRSLTQVKELGIAIFNNRNLAADLTQIFEVYWYLGVNNLPYNWKNF
YPAYYNTDHPLSMNVSGVPHSVFIASAPQQLCTMERTNDLTALLSCIGNASKFVYVSVMN
FIPIIYSKAGNILFWPYIEDELRRTAIDRKVSVKLLISCWQRSSFIMRNFLRSIAMLKSK
NIDIEVKLFIVPDTDPPIPYSRVNHAKYMVTDKTAYIGTSNWTGNYFTDTCGTSINITPD
DGLGLRQQLEDIFMRDWNSKYSYELYDTSPTKRCRLLKNMKQCTNDIYSDEIQPEKEIPE
YSLE
>CUI02274 |CPXV045 protein[Cowpox virus]
MSANCMFNLDNDYIYCKYWKPITYPKALVFISHGAGEHSGRYDELAENISSLGILVFSHD
HIGHGRSNGEKMMIDDFGTYVRDVVQHVVTIKSTYPGVPVFLLGHSMGATISILAAYENP
NLFTAMILMSPLVNAEAVPRLNLLAAKLMGAITPNAPVGKLCPESVSRDMDEVYKYQYDP
LVNHEKIKAGFASQVLKATNKVRKIIPKINTPSLILQGTNNEISDVSGAYYFMQHANCNR
EIKIYEGAKHHLHKETDEVKKSVMKEIETWIFNRVK
>CUI022799 |CPXV046 protein[Cowpox virus]
MATKSDYEDAVFYFVDDDEICSRDSIIDLIDEYITWRNHVIVFNKDITSCGRLYKELMKF
DDAAIRYYGIDKINEIVEAMSEGDHYINLTEVHDQESLFATIGICAKITEHWGYKKISES
RFQSLGNITDLMTDDNINILILFLEKKLN
>CUI02276 |hypothetical protein pCPXV0240[Cowpox virus]
MDFCKIDVVVSFAHSLDNLINFINTIVPYSSIIELHQFLVESSTTGNIFVKHYNMISPRD
IFIY

чем у меня должен быть новый file3, такой как:

>CUI02273 |CPXV044 protein[Cowpox virus]
MNPDNTIAVITETIPIGMQFDKVYLSTFNVWREILSNTTKTLDISSFYWSLLDEVGTNFG
TTILNEIVQLPKRGVRVRVAVNKSNKPLKDVETLQMAGVEVRYIDITNILGGVLHTKFWI
SDNTHIYLGSANMDWRSLTQVKELGIAIFNNRNLAADLTQIFEVYWYLGVNNLPYNWKNF
YPAYYNTDHPLSMNVSGVPHSVFIASAPQQLCTMERTNDLTALLSCIGNASKFVYVSVMN
FIPIIYSKAGNILFWPYIEDELRRTAIDRKVSVKLLISCWQRSSFIMRNFLRSIAMLKSK
NIDIEVKLFIVPDTDPPIPYSRVNHAKYMVTDKTAYIGTSNWTGNYFTDTCGTSINITPD
DGLGLRQQLEDIFMRDWNSKYSYELYDTSPTKRCRLLKNMKQCTNDIYSDEIQPEKEIPE
YSLE
>CUI02274 |CPXV045 protein[Cowpox virus]
MSANCMFNLDNDYIYCKYWKPITYPKALVFISHGAGEHSGRYDELAENISSLGILVFSHD
HIGHGRSNGEKMMIDDFGTYVRDVVQHVVTIKSTYPGVPVFLLGHSMGATISILAAYENP
NLFTAMILMSPLVNAEAVPRLNLLAAKLMGAITPNAPVGKLCPESVSRDMDEVYKYQYDP
LVNHEKIKAGFASQVLKATNKVRKIIPKINTPSLILQGTNNEISDVSGAYYFMQHANCNR
EIKIYEGAKHHLHKETDEVKKSVMKEIETWIFNRVK
>CUI02276 |hypothetical protein pCPXV0240[Cowpox virus]
MDFCKIDVVVSFAHSLDNLINFINTIVPYSSIIELHQFLVESSTTGNIFVKHYNMISPRD
IFIY

, где

CUI02270 ; CUI02272 ; CUI02271 ; CUI022799 были удалены, потому что там, где присутствует в обоих file 1 and 2,

У кого-нибудь есть идеи?

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 10 октября 2019

Вы имеете дело с файлами FASTA, и вы можете легко обрабатывать их с помощью awk:

$ awk '(NR==FNR){list[$1];next}
       /^>/{key=$0;sub(/^> */,"",key);sub(/ *[|].*$/,"",key);f=1}
       (key in list) {f=0}
       f' file1 file2

Это работает следующим образом:

  1. (NR==FNR){list[$1];next}: если мы прочитаем первый файл (NR==FNR), сохраните запись в list и перейдем к следующей записи
  2. /^>/{key=$0;sub(/^> */,"",key);sub(/ *[|].*$/,"",key);f=1}: Если мы встретим имя последовательности,извлеките ключ, который находится между > и первым |. Удалите все ненужные детали с помощью sub и установите флаг f на 1. Этот флаг указывает, собираемся ли мы печатать последовательность или нет.
  3. Проверьте, находится ли последовательность с ключом key в list. Если это так, установите флаг f на 0, поскольку мы не хотим печатать.
  4. f: Эта строка будет напечатана, если f==1.
...