Yes that works thanks!
I'm having trouble with my syntax in trying to remove the last '_' in the header to replace with the string ':size=' and then add a ';' after the number. Original file looks like this:
>ART01B_100_M7_ID100005_1
TAAGAGGAGGAATTTTTCATAGAGGATTGTCTGTAGACTTAGTAATTTTTTCTCTTCATTTAGCTGGAATTTCTTCTCTT
TTAGGGGCTGTAAATTTTATTACTACAATTCTTAATTGTCGATCTTTAGGGGTTTGGTGAGATGAATTGCCCTTATTTGT
>PAG05A_100_M7_ID102325_189
TAAGAGGAGGAATTTTTCATAGAGGATTGTCTGTAGACTTAGTAATTTTTTCTCTTCATTTAGCTGGAATTTCTTCTCTT
TTAGGGGCTGTAAATTTTATTACTACAATTCTTAATTGTCGATCTTTAGGGGTTTGGTGAGATGAATTGCCCTTATTTGT
>KIN05B_100_M7_ALT_ID230005_46
TAAGAGGAGGAATTTTTCATAGAGGATTGTCTGTAGACTTAGTAATTTTTTCTCTTCATTTAGCTGGAATTTCTTCTCTT
TTAGGGGCTGTAAATTTTATTACTACAATTCTTAATTGTCGATCTTTAGGGGTTTGGTGAGATGAATTGCCCTTATTTGT
and am trying to make it look like the following:
>ART01B_100_M7_ID100005;size=1;
TAAGAGGAGGAATTTTTCATAGAGGATTGTCTGTAGACTTAGTAATTTTTTCTCTTCATTTAGCTGGAATTTCTTCTCTT
TTAGGGGCTGTAAATTTTATTACTACAATTCTTAATTGTCGATCTTTAGGGGTTTGGTGAGATGAATTGCCCTTATTTGT
>PAG05A_100_M7_ID102325;size=189;
TAAGAGGAGGAATTTTTCATAGAGGATTGTCTGTAGACTTAGTAATTTTTTCTCTTCATTTAGCTGGAATTTCTTCTCTT
TTAGGGGCTGTAAATTTTATTACTACAATTCTTAATTGTCGATCTTTAGGGGTTTGGTGAGATGAATTGCCCTTATTTGT
>KIN05B_100_M7_ALT_ID230005;size=46;
TAAGAGGAGGAATTTTTCATAGAGGATTGTCTGTAGACTTAGTAATTTTTTCTCTTCATTTAGCTGGAATTTCTTCTCTT
TTAGGGGCTGTAAATTTTATTACTACAATTCTTAATTGTCGATCTTTAGGGGTTTGGTGAGATGAATTGCCCTTATTTGT
Thanks!
2 answers
Try this:
vamsi@cistron:~$ cat temp.txt
>ART01B_100_M7_ID100005_1
TAAGAGGAGGAATTTTTCATAGAGGATTGTCTGTAGACTTAGTAATTTTTTCTCTTCATTTAGCTGGAATTTCTTCTCTT
TTAGGGGCTGTAAATTTTATTACTACAATTCTTAATTGTCGATCTTTAGGGGTTTGGTGAGATGAATTGCCCTTATTTGT
>PAG05A_100_M7_ID102325_189
TAAGAGGAGGAATTTTTCATAGAGGATTGTCTGTAGACTTAGTAATTTTTTCTCTTCATTTAGCTGGAATTTCTTCTCTT
TTAGGGGCTGTAAATTTTATTACTACAATTCTTAATTGTCGATCTTTAGGGGTTTGGTGAGATGAATTGCCCTTATTTGT
>KIN05B_100_M7_ALT_ID230005_46
TAAGAGGAGGAATTTTTCATAGAGGATTGTCTGTAGACTTAGTAATTTTTTCTCTTCATTTAGCTGGAATTTCTTCTCTT
TTAGGGGCTGTAAATTTTATTACTACAATTCTTAATTGTCGATCTTTAGGGGTTTGGTGAGATGAATTGCCCTTATTTGT
vamsi@cistron:~$ sed 's/\(>.*\)_\([0-9]*\)/\1;size=\2/g' temp.txt
>ART01B_100_M7_ID100005;size=1
TAAGAGGAGGAATTTTTCATAGAGGATTGTCTGTAGACTTAGTAATTTTTTCTCTTCATTTAGCTGGAATTTCTTCTCTT
TTAGGGGCTGTAAATTTTATTACTACAATTCTTAATTGTCGATCTTTAGGGGTTTGGTGAGATGAATTGCCCTTATTTGT
>PAG05A_100_M7_ID102325;size=189
TAAGAGGAGGAATTTTTCATAGAGGATTGTCTGTAGACTTAGTAATTTTTTCTCTTCATTTAGCTGGAATTTCTTCTCTT
TTAGGGGCTGTAAATTTTATTACTACAATTCTTAATTGTCGATCTTTAGGGGTTTGGTGAGATGAATTGCCCTTATTTGT
>KIN05B_100_M7_ALT_ID230005;size=46
TAAGAGGAGGAATTTTTCATAGAGGATTGTCTGTAGACTTAGTAATTTTTTCTCTTCATTTAGCTGGAATTTCTTCTCTT
TTAGGGGCTGTAAATTTTATTACTACAATTCTTAATTGTCGATCTTTAGGGGTTTGGTGAGATGAATTGCCCTTATTTGT
By default, sed is 'greedy' so \1 will always include everything until the last underscore.
Sorry, did not notice the trailing semi-colon; if you change the sed statement to something like this, you can add it with a single command:
sed 's/\(>.*\)_\([0-9]*\)/\1;size=\2;/g'
I'd recommend --extended-regexp while working with backreferences, it removes the need for backslashes in the match expression.
sed -r 's/(>.*)_([0-9]*)/\1;size=\2;/g' temp.txt
If an answer was helpful you should upvote it, if the answer resolved your question you should mark it as accepted.

I seem to keep removing everything in the line and just replacing with ';size=. These are three of the attempts that do this: sed '/>/ s/(.)_.$/;size=/g' , sed '/>/ s/(.)_/;size=/g', sed '/>/ s/(.)_./;size=/g'. I'm missing something to indicate not to remove everything before that last _ but to replace it with ;size=. I know how to add just the ';' at the end which is sed 's/$/;/' so if the first replacement part is fixed then I can add that sed function to finish up the header but if it's possible to do all at once, great.
Yes that works! Thanks.
Log in to answer this question.
I added markup to your post for increased readability. You can do this by selecting the text and clicking the 101010 button. When you compose or edit a post that button is in your toolbar, see image below:
Please show us what you tried, we'd be happy to put you on the right track.
I seem to keep removing everything in the line and just replacing with ';size=. These are three of the attempts that do this: sed '/>/ s/(.)_.$/;size=/g' , sed '/>/ s/(.)_/;size=/g', sed '/>/ s/(.)_./;size=/g'. I'm missing something to indicate not to remove everything before that last _ but to replace it with ;size=. I know how to add just the ';' at the end which is sed 's/$/;/' so if the first replacement part is fixed then I can add that sed function to finish up the header but if it's possible to do all at once, great.