想到哪就更新到哪
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