生物信息中的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

統(tǒng)計各長度的序列出現過多少次

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忽略大小寫。
方括號內的^意為非,方括號外的是行首定位符。

ls *.sh|while read id; do sed -i '1i\#!/bin/bash' $id ; done
ls *.sh|while read id; do sed -i '$a wait' $id ; done

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

后面跟了多個命令的時候先執(zhí)行BEGIN模式中的,就算沒有輸入文件也會先執(zhí)行。然后判斷大于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

awk 'FNR==NR{a[NR]=$3;next}{$2=a[FNR]}1' f2 f1

用 file2 的第三列替換 file1 的第二列
替換barcode.txt文件第二列的_為-

awk '{sub("_", "-", $2);print}' barcode.txt |head

選取年齡大于20的人,并按姓名排序

awk '{if ($4>20) print $0}' test.txt|sort -rk2

計算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
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容