Zez
Zez

Reputation: 135

Creating multiple files with names matching a pattern from one file

I have a text file such as:

>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

I want to create multiple text files with the content between each and every "--". The text files would be named after the the string starting with ">".

In the end I would have these text files:

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

With the following content:

Tolten.WP_096573835.1 text file:

>Tolten.WP_096573835.1
  MSSPKSLLIRRARIILPNGELMVGDVLTRDRQIVEVAPEIYTPTPTTEIDAAGLTLLPGVIDPQVHFREPGLEHKEDLFTASCACAKGGVTSFLEMPNTRPLTTN

Trivar.WP_011317016.1 text file:

>Trivar.WP_011317016.1
    MSSPQSLLIRGARILLPNGEFLLGDVLIRDRHIIEVGTEIVNTTPATEIDAKGLTLLPGVIDPQVHFREPGLEHKEDLFTASCACAKGGVTSFLEMPNTRPLTTS

uniSU2.WP_085434158.1

>uniSU2.WP_085434158.1
    MTQLLIRHAQILLPNGQFLLGDVLTQDGKILEVASEIAATDLSNIIDATGLTLLPGVIDPQVHFREPGLEHKEDLFTATCACAKGGVTSFLEMPNTRPLTTTQAA

Chlfri.WP_016876644.1 text file:

>Chlfri.WP_016876644.1
    MSETPLLDKVIKNVRVVRPNQHTIEKVDIGIKNGKFAQIAPQISPDQTKEVFDAKNLLGFPGVVDAHMHIGIYQPLAQDAVSESKAAAMGGVTTSLNYIRTGQYY

>Noslin.WP_099070767.1 text file:

>Noslin.WP_099070767.1
MSEASLLDRVIKNVRVVRPHNDAIELLDLGIKDGKFARIASHISPDTAKEVFDAKNLLGFPGVVDAHMHIGIYQPLDKDAVTESKAAAMGGVTTSLNYIRTGQYY

I know csplit works for this sort of thing:

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

But I can't get it to name the files appropriately.

Does anyone know how to help?

Thanks in advance :)

Upvotes: 0

Views: 283

Answers (1)

MarcoLucidi
MarcoLucidi

Reputation: 2177

I'm afraid csplit can't do that directly, you can only change prefix and suffix of filenames using a "fixed" format. nothing stops you of doing the renaming afterwards using a simple loop, e.g.:

$ 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
$

you can easily combine csplit and the loop to get a one-liner:

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

Upvotes: 1

Related Questions