引言:生物信息学文件多样,通常我们会遇到各种将不同格式进行转换或者把文件修改成我们想要的那种格式的需求,不懂生信的小伙伴们会请教会生信的小伙伴,其实会生信的同学面对这些问题时往往也会很头大(OS:我们也不是万能的呀!
)。
于是,熟悉各种软件的小伙伴随手操起了手边的工具完成了转化,不熟悉的小伙伴吭哧吭哧撸起了袖子开始写代码,费时也费力。那么有没有常用的简单方法来解决一些分析需求呢?这期小编我就简单介绍一些一行搞定格式转化的shell短代码。(有一些命令可能你都没有见过,但是你们目前只用知道这些命令能完成相应的功能,对于每个命令具体是干什么的,还需后期大量地接触和理解)
01
序列操作
1. 反义互补
$ echo 'ATTGCTATGCTNNNT' | rev | tr 'ACTG' 'TGAC'
ANNNAGCATAGCAAT
2. 将fasta文件分割成多个文件,一个文件一个fasta序列
csplit -z -q -n 4 -f sequence_ test.fa /\>/ {*}
同时你也可以用awk来使用
awk '/^>/{s=++d".fa"} {print > s}' test.fa
3. 多行的fasta文件合并为一行
cat test_multiline.fa | awk '/^>/{if(N>0) printf("\n"); ++N; printf("%s\n",$0);next;} {printf("%s",$0);}END{printf("\n");}'
或者你也可以使用另外一种方法
awk 'BEGIN{RS=">"}NR>1{sub("\n","\t"); gsub("\n",""); gsub("\t", "\n"); print RS$0}' test_multiline.fa
4. 一行的fasta文件变成60bp碱基一行的fasta文件
awk -v FS= '/^>/{print;next}{for (i=0;i<=NF/60;i++) {for (j=1;j<=60;j++) printf "%s", $(i*60 +j); print ""}}' test.fa
或者你也可以图简单使用fold命令
fold -w 60 test.fa
5. 对fastq文件提取子集,srand()是生成随机数的种子,当其中值固定的时候,每次运行的时候,都会生成相同的子样本(当随机数小于0.5时,就将这条序列输出)
cat test.fq | paste - - - - | awk 'BEGIN{srand(123)}{if(rand() < 0.5) print $0}' | tr '\t' '\n'
这里当srand设置成123的时候,rand()函数分别为以下的值,所以只有两条序列的随机值是小于0.5的,因此只输出了两条fastq序列:
6. 通过序列id提取序列
grep -A1 -w -f id.txt test.fa
文件/文件夹操作
1
按照文件第一列的值,将文件分割输出到对应值为文件名的文件中
awk '{print >> $1; close($1)}' test.txt
2
把bed文件按照染色体进行分割
cat test.bed | sort -k1,1 -k2,2n | sed 's/^chr//' | awk '{print $0 >> $1."bed"}'
3
移动一个文件夹下面的文件到另外一个文件夹下面,但是避免移动已经完成的文件
rsync -avhP /from/dir /to/dir
4
具体查看多层结构文件夹的文件大小,max-depth就是指定的文件夹层数;查看文件夹总的文件大小
du -h --max-depth=2
du -sh .
文件内容操作
删掉空白行,删掉最后一行
sed '/^$/d'
sed '$d'
02
根据file2指定的列来过滤file1中的行
awk -F"\t" 'NR==FNR{a[$1$2$3]++;next};a[$1$2$3] > 0' file2 file1
03
去掉fasta序列名后面不想要的字符串
(如>seq1 A00679:63:HGVWCDSXX:4:1271:5927:18176)
cat test.fa | gawk '/^>/ { b=gensub(" A00679:.+", "", "g", $0); print b; next} {print}'
04
将文件每两行合并成一行,并用tab分割
cat test.txt| awk 'ORS=NR%2?"\t":"\n"'
05
对fastq文件进行某个序列的匹配,且结果仍保留fastq格式
06
在每个fasta文件序列名前面加上另一个文件中自定义的字符串(自定义 的字符串的行数得和fasta的序列个数一样)
paste <(cat bioinfo_head.txt) <(cat test.fa| paste - - | cut -c2-) | awk '{printf(">%s_%s\n%s\n",$1,$2,$3);}'
07
合并多个具有相同文件头的文件,同时保留第一个文件的文件头
awk 'FNR==1 && NR!=1{next;}{print}' *.txt
08
替换某一列的值
awk '{gsub(pattern,replace,$5)}1' in.file
09
查看一个文件有多少列
cat file.tsv | head -1 | tr "\t" "\n" | wc -l
awk '{print NF; exit}' file.tsv
010
检查文件是否所有的行的列数都是相同的
awk '{print NF}' test.txt | sort -nu | wc -l
011
统计每一列不同值的个数
awk '{split(x,C); n=split($2,F,/,/); for(i in F) if(C[F[i]]++) n--; print $1, n}' file