Создание нескольких файлов с именами, соответствующими шаблону, из одного файла

#linux #command-line #csplit

#linux #командная строка #csplit

Вопрос:

У меня есть текстовый файл, такой как:

 >Tolten.WP_096573835.1
MSSPKSLLIRRARIILPNGELMVGDVLTRDRQIVEVAPEIYTPTPTTEIDAAGLTLLPGVIDPQVHFREPGLEHKEDLFTASCACAKGGVTSFLEMPNTRPLTTN
--
>Trivar.WP_011317016.1
MSSPQSLLIRGARILLPNGEFLLGDVLIRDRHIIEVGTEIVNTTPATEIDAKGLTLLPGVIDPQVHFREPGLEHKEDLFTASCACAKGGVTSFLEMPNTRPLTTS
--
>uniSU2.WP_085434158.1
MTQLLIRHAQILLPNGQFLLGDVLTQDGKILEVASEIAATDLSNIIDATGLTLLPGVIDPQVHFREPGLEHKEDLFTATCACAKGGVTSFLEMPNTRPLTTTQAA
--
>Chlfri.WP_016876644.1
MSETPLLDKVIKNVRVVRPNQHTIEKVDIGIKNGKFAQIAPQISPDQTKEVFDAKNLLGFPGVVDAHMHIGIYQPLAQDAVSESKAAAMGGVTTSLNYIRTGQYY
--
>Noslin.WP_099070767.1
MSEASLLDRVIKNVRVVRPHNDAIELLDLGIKDGKFARIASHISPDTAKEVFDAKNLLGFPGVVDAHMHIGIYQPLDKDAVTESKAAAMGGVTTSLNYIRTGQYY
  

Я хочу создать несколько текстовых файлов с содержимым между каждым «—«. Текстовые файлы будут называться после строки, начинающейся с «>».

В итоге у меня были бы эти текстовые файлы:

 Tolten.WP_096573835.1
Trivar.WP_011317016.1
uniSU2.WP_085434158.1
Chlfri.WP_016876644.1
Noslin.WP_099070767.1
  

Со следующим содержимым:

Толтен.Текстовый файл WP_096573835.1:

 >Tolten.WP_096573835.1
  MSSPKSLLIRRARIILPNGELMVGDVLTRDRQIVEVAPEIYTPTPTTEIDAAGLTLLPGVIDPQVHFREPGLEHKEDLFTASCACAKGGVTSFLEMPNTRPLTTN
  

Trivar.Текстовый файл WP_011317016.1:

 >Trivar.WP_011317016.1
    MSSPQSLLIRGARILLPNGEFLLGDVLIRDRHIIEVGTEIVNTTPATEIDAKGLTLLPGVIDPQVHFREPGLEHKEDLFTASCACAKGGVTSFLEMPNTRPLTTS
  

uniSU2.WP_085434158.1

 >uniSU2.WP_085434158.1
    MTQLLIRHAQILLPNGQFLLGDVLTQDGKILEVASEIAATDLSNIIDATGLTLLPGVIDPQVHFREPGLEHKEDLFTATCACAKGGVTSFLEMPNTRPLTTTQAA
  

Текстовый файл Chlfri.WP_016876644.1:

 >Chlfri.WP_016876644.1
    MSETPLLDKVIKNVRVVRPNQHTIEKVDIGIKNGKFAQIAPQISPDQTKEVFDAKNLLGFPGVVDAHMHIGIYQPLAQDAVSESKAAAMGGVTTSLNYIRTGQYY
  

>Noslin.Текстовый файл WP_099070767.1:

 >Noslin.WP_099070767.1
MSEASLLDRVIKNVRVVRPHNDAIELLDLGIKDGKFARIASHISPDTAKEVFDAKNLLGFPGVVDAHMHIGIYQPLDKDAVTESKAAAMGGVTTSLNYIRTGQYY
  

Я знаю, что csplit работает для такого рода вещей:

 csplit --suppress-matched original_text_file.txt '/^--/' '{*}'
  

Но я не могу заставить его назвать файлы соответствующим образом.

Кто-нибудь знает, как помочь?

Заранее спасибо 🙂

Ответ №1:

Боюсь, csplit я не могу сделать это напрямую, вы можете изменить только префикс и суффикс имен файлов, используя «фиксированный» формат. ничто не мешает вам впоследствии выполнить переименование с помощью простого цикла, например:

 $ csplit --suppress-matched original_text_file.txt '/^--$/' '{*}'
129
129
129
129
129
$ for f in xx*; do mv "$f" "`head -n 1 "$f" | cut -c 2-`"; done
$ ls -1
Chlfri.WP_016876644.1
Noslin.WP_099070767.1
original_text_file.txt
Tolten.WP_096573835.1
Trivar.WP_011317016.1
uniSU2.WP_085434158.1
$
  

вы можете легко объединить csplit и цикл, чтобы получить однострочный:

 csplit --suppress-matched original_text_file.txt '/^--$/' '{*}' amp;amp; for f in xx*; do mv "$f" "`head -n 1 "$f" | cut -c 2-`"; done