使用while循环和if / else语句替换fasta文件中的一些行和附加文本

时间:2017-08-09 18:19:20

标签: bash unix

我正在使用fasta文件,需要为每个标题添加行特定的文本。例如,如果我的文件是:

>TER1
AGCATGCTAGCTAGTCGACTCGATCGCATGCTC
>TER2
AGCATGCTAGCTAGACGACTCGATCGCATGCTC
>URC1
AGCATGCTAGCTAGTCGACTCGATCGCATGCTC
>URC2
AGCATGCTACCTAGTCGACTCGATCGCATGCTC
>UCR3
AGCATGCTAGCTAGTCGACTCGATGGCATGCTC

我想要一个读取每一行的while循环;对于那些开头为>的人,我想在|population:之后附加>加上前三个字符。第一行是:

>TER1|population:TER

我无法弄清楚如何使这项工作。到目前为止,这是我最好的尝试。

filename="testfasta.fa"
while read -r line 
do 
    if [[ "$line" == ">"* ]]; then
        id=$(cut -c2-4<<<"$line")
        printf $line"|population:"$id"\n" >>outfile
    else
        printf $line"\n">>outfile
    fi
done <"$filename"

这会生成一个文件,其中包含原始标题,并且每行都在一行上。 谁能告诉我哪里出错了?我的if和else循环根本不起作用! 谢谢!

2 个答案:

答案 0 :(得分:1)

如果你真的想要可以使用while循环, 但是sed会更简单:

sed -e 's/^>\(...\).*/&|population:\1/' "$filename"

也就是说,对于以>开头的行(模式:^>), 捕获接下来的3个字符(\(...\)), 并匹配行的其余部分(.*), 替换为原来的行(&), 和固定字符串|population:, 最后捕获了3个字符(\1)。

这将产生您的输入:

>TER1|population:TER

AGCATGCTAGCTAGTCGACTCGATCGCATGCTC

>TER2|population:TER

AGCATGCTAGCTAGACGACTCGATCGCATGCTC

>URC1|population:URC

AGCATGCTAGCTAGTCGACTCGATCGCATGCTC

>URC2|population:URC

AGCATGCTACCTAGTCGACTCGATCGCATGCTC

>UCR3|population:UCR

AGCATGCTAGCTAGTCGACTCGATGGCATGCTC

或者您可以使用此awk,也可以生成相同的输出:

awk '{sub(/^>.*/, $0 "|population:" substr($0, 2, 3))}1' "$filename"

答案 1 :(得分:1)

您可以在awk

中快速完成此操作
awk '$1~/^>/{$1=$1"|population:"substr($1,2,3)}{}1' infile.txt > outfile.txt
$ awk '$1~/^>/{$1=$1"|population:"substr($1,2,3)}{}1' testfile
>TER1|population:TER

AGCATGCTAGCTAGTCGACTCGATCGCATGCTC

>TER2|population:TER

AGCATGCTAGCTAGACGACTCGATCGCATGCTC

>URC1|population:URC

AGCATGCTAGCTAGTCGACTCGATCGCATGCTC

>URC2|population:URC

AGCATGCTACCTAGTCGACTCGATCGCATGCTC

>UCR3|population:UCR

AGCATGCTAGCTAGTCGACTCGATGGCATGCTC

这里awk会:

  1. 测试记录是否以>开头$1查看第一个字段,但在这种情况下,整个记录的$0也可以正常工作。 ~将执行正则表达式测试,^>表示&#34;从>&#34;开始。进行测试:($1~/^>/
  2. 如果是这样,它会将第一个字段设置为您要查找的输出(使用substr()来获取所需字符串的位。{$1=$1"|population:"substr($1,2,3)}
  3. 最后,它会打印出整个记录(如果适用,可以更改):{}1这是{print $0}的简写或打印整个记录。