生物信息中的grep sed awk 与正则表达式
想到哪就更新到哪
grep
grep -o '^>\S\+' test.fasta |grep -o "[^>]\+"
提取fasta序列id。从fa文件里面搜索以>开头后面有至少一个字母的行
如果没有+,只默认输出匹配到的字符而非字符串
grep -v '>' test.fasta|perl -alne '{print length}'|sort|uniq -c
统计各长度的序列出现过多少次
sed
sed '/^\s*$/d' testfile
删除testfile中的所有空白行。^为开头,$为结尾,\d为删除,即:删除所有行首和行尾间是空白符的行。
sed '[address]s/pattern/replacement/[flags]' filename
sed 's/^A.*$/NA/' testfile.txt
\s 一切空白字符,s/ 替换,\S 一切字符。把以A为开头,后面跟了若干个字符的行整行替换成NA。
为什么不能去掉A后面的.呢
sed -r 's/^(\S+)(\s+)(\S+)/\3 \2 \1/' testfile.txt
分组元字符交换第一列和第二列,(\s+)意为多个空格,置于第二个分组。
-r参数允许不用转义字符,-i直接修改原文件后输出,/i忽略大小写。
方括号内的^意为非,方括号外的是行首定位符。
awk
awk [option] 'pattern {action}' filename
awk '{print $1,$3}' datefile.txt
打印第一列和第三列,以空格分隔,如果没有逗号则不分隔。$0是全文。
awk '{print $NF}' datefile.txt
awk -F '\t' -v OFS=':' '{print NF,$1}' datefile.txt
打印每行的最后一列,NF为列的数量
以\t为输入的分隔符,从而得知文件有几列并取出第一列。以:为输出的分隔符,将NF和$1组合起来
echo 1.2 |awk '{printf "[%10.2f]\n", $1}'
[ 1.20]
printf控制格式化输出将1.2作为宽度10,精度2的浮点数输出并换行。如果不止一个输出的话可以换$1和$0这些
echo -e '10\n20\n30'|awk 'BEGIN{print "start"}1>25 ||$1<15'
start
10
30
后面跟了多个命令的时候先执行BEGIN模式中的,就算没有输入文件也会先执行。然后判断大于25的或小于10的输出。或||与&&非!
echo-r '1\n2\n3\n4' |awk '{s = s+$1} END {print s}'
10
对前面这组数进行累加,如果没有END的话每一次求和都会被输出,加上END模式后只输出最后一次求和,也就是累加结果
echo 'ABC'|awk '{sub(/B/, "b" );print$0}'
echo 'ABC abc'|awk '{sub(/[A-Z]+/, "U",$1 );print$0}'
替换,gsub则为全局替换。替换串需要//,目标串是string,如果不指定目标默认为$0
计算fasta文件的每条序列长度与总长
less rna.fna| awk '{ if ($1 ~/^>/) { if (NR>1) {print ""};printf $1 "\t"} else {printf $1}}'|\
awk '{print $1 , length ($2)}'|\
sed 's/^>//'|\
awk '{print ; sum +=$2} END{print "total_length " sum}'
如果这一列以>开头,printf(没有换行符)并加一个\t。如果不是第一列还要加上\n(print ""就会换行了)
如果这一列不以>开头,把length ($2)放在$1后面。最后通过sed的s//去掉了开头的>
通过累加来计算总长,用END模式把输出放在最后面
批量修改基因组文件名称
原文件名为genome.id_chr1.fa、genome.id_chr2.fa等等,而且都在split目录下。现在要生成一个脚本,把他们批量改成chr1.fa等等
ls ./split/genome.id_*.fa|\#取出所有待处理文件名
sed -r 's/./split/genome.id_/' |\
awk '{print "mv split/genome.id_"$1" split/"$1}' >mv_name.sh
sh mv_name.sh