专栏首页生物信息学只用一行来颠覆你处理文件的方式

只用一行来颠覆你处理文件的方式

引言:生物信息学文件多样,通常我们会遇到各种将不同格式进行转换或者把文件修改成我们想要的那种格式的需求,不懂生信的小伙伴们会请教会生信的小伙伴,其实会生信的同学面对这些问题时往往也会很头大(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
02

文件/文件夹操作

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 .
03

文件内容操作

01

删掉空白行,删掉最后一行

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
结束语:这里只是很简单列出一些常用的或者方便操作的命令行,至于很多别的格式转化,如bam->fastq、bed->gtf等都可以通过samtools或者UCSC开发的小程序来完成,还有Li Heng大神的seqtk能够帮助我们完成很多对fasta/fastq文件的操作,有兴趣的小伙伴们可以自行搜索哦。如果有特别的问题或需求,欢迎在评论区留言,我们很高兴来为大家分享简单快捷的生信文件处理方法!

本文分享自微信公众号 - 生物信息学(swxxx1),作者:小峰

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-11-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 关于k-mer与基因组(组装)的那些事

    随着越来越多物种的基因组被测序发表,极大丰富了我们对物种起源、进化等方面的认知,同时也为各种物种的研究打下了基础。但是在面对复杂基因组时或者参考基因组并未发表的...

    阿凡亮
  • 一键批量计算kaks

    ParaAT是中科院基因组所的章张课题组开发的工具,它整合了计算ka/ks所需的一整套分析,包括:

    阿凡亮
  • 如何使程序在Linux后台运行

    这样一来,test程序就在后台运行了。但是,这样处理还不够,因为这样做虽然程序是在后台运行了,但log依然不停的输出到当前终端。因此,要让终端彻底的清静,还应将...

    阿凡亮
  • linux 的一些脑洞操作

    把当前文件夹的文件名用","连接成一行,或者将多行转变为一行 ls | paste -s -d "," # -s 选项将输入进行一次性粘贴 ls | xarg...

    用户1680321
  • awk工具

    叶瑾
  • Python_鸡兔同笼

    ''' 问题:鸡兔同笼 用户输入 h f 已知:同一个笼子里 鸡兔共h只 总脚数f只 1求解 2循环枚举 '''

    瑞新
  • 那些 Shell、Awk 中自动隐式类型转换的“坑”

    1、问题: 在林林总总的编程语言里,弱类型的语言着实不少,一方面这种“动态类型”用起来很方便,而另一方面则“坑”你没商量~ 常见的 SQL、Shell、A...

    用户1177713
  • CM: webservice 元数据在word template中的存储

    在product overview page里点With Template button 基于word template创建attachment:

    Jerry Wang
  • Python学习——程序入口

    python和C++/Java不一样,没有主函数一说,也就是说python语句执行不是从所谓的主函数main开始的。

    py3study
  • ASCIIMathML技术简介~

    ASCIIMathML.js是一种将ASCII符号翻译成直观的MathML(HTML版本)的开源JavaScript脚本。

    Enjoy233

扫码关注云+社区

领取腾讯云代金券