我正在使用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循环根本不起作用! 谢谢!
答案 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
查看第一个字段,但在这种情况下,整个记录的$0
也可以正常工作。 ~
将执行正则表达式测试,^>
表示&#34;从>
&#34;开始。进行测试:($1~/^>/
){$1=$1"|population:"substr($1,2,3)}
{}1
这是{print $0}
的简写或打印整个记录。