前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >只用一行来颠覆你处理文件的方式

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

作者头像
阿凡亮
发布2020-04-14 15:04:04
1.9K0
发布2020-04-14 15:04:04
举报
文章被收录于专栏:生物信息学生物信息学

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

)。

于是,熟悉各种软件的小伙伴随手操起了手边的工具完成了转化,不熟悉的小伙伴吭哧吭哧撸起了袖子开始写代码,费时也费力。那么有没有常用的简单方法来解决一些分析需求呢?这期小编我就简单介绍一些一行搞定格式转化的shell短代码。(有一些命令可能你都没有见过,但是你们目前只用知道这些命令能完成相应的功能,对于每个命令具体是干什么的,还需后期大量地接触和理解)

01

序列操作

1. 反义互补

代码语言:javascript
复制
$ echo 'ATTGCTATGCTNNNT' | rev | tr 'ACTG' 'TGAC'
ANNNAGCATAGCAAT

2. 将fasta文件分割成多个文件,一个文件一个fasta序列

代码语言:javascript
复制
csplit -z -q -n 4 -f sequence_ test.fa /\>/ {*}

同时你也可以用awk来使用

代码语言:javascript
复制
awk '/^>/{s=++d".fa"} {print > s}' test.fa

3. 多行的fasta文件合并为一行

代码语言:javascript
复制
cat test_multiline.fa | awk '/^>/{if(N>0) printf("\n"); ++N; printf("%s\n",$0);next;} {printf("%s",$0);}END{printf("\n");}'

或者你也可以使用另外一种方法

代码语言:javascript
复制
awk 'BEGIN{RS=">"}NR>1{sub("\n","\t"); gsub("\n",""); gsub("\t", "\n"); print RS$0}' test_multiline.fa

4. 一行的fasta文件变成60bp碱基一行的fasta文件

代码语言:javascript
复制
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命令

代码语言:javascript
复制
fold -w 60 test.fa

5. 对fastq文件提取子集,srand()是生成随机数的种子,当其中值固定的时候,每次运行的时候,都会生成相同的子样本(当随机数小于0.5时,就将这条序列输出)

代码语言:javascript
复制
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提取序列

代码语言:javascript
复制
grep -A1 -w -f id.txt test.fa
02

文件/文件夹操作

1

按照文件第一列的值,将文件分割输出到对应值为文件名的文件中

代码语言:javascript
复制
awk '{print >> $1; close($1)}' test.txt

2

把bed文件按照染色体进行分割

代码语言:javascript
复制
cat test.bed | sort -k1,1 -k2,2n | sed 's/^chr//' | awk '{print $0 >> $1."bed"}'

3

移动一个文件夹下面的文件到另外一个文件夹下面,但是避免移动已经完成的文件

代码语言:javascript
复制
rsync -avhP /from/dir /to/dir

4

具体查看多层结构文件夹的文件大小,max-depth就是指定的文件夹层数;查看文件夹总的文件大小

代码语言:javascript
复制
du -h --max-depth=2
du -sh .
03

文件内容操作

01

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

代码语言:javascript
复制
sed '/^$/d'
sed '$d'

02

根据file2指定的列来过滤file1中的行

代码语言:javascript
复制
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)

代码语言:javascript
复制
cat test.fa | gawk '/^>/ { b=gensub(" A00679:.+", "", "g", $0); print b; next} {print}'

04

将文件每两行合并成一行,并用tab分割

代码语言:javascript
复制
cat test.txt| awk 'ORS=NR%2?"\t":"\n"'

05

对fastq文件进行某个序列的匹配,且结果仍保留fastq格式

06

在每个fasta文件序列名前面加上另一个文件中自定义的字符串(自定义 的字符串的行数得和fasta的序列个数一样)

代码语言:javascript
复制
paste <(cat bioinfo_head.txt) <(cat test.fa| paste - - | cut -c2-) | awk '{printf(">%s_%s\n%s\n",$1,$2,$3);}'

07

合并多个具有相同文件头的文件,同时保留第一个文件的文件头

代码语言:javascript
复制
awk 'FNR==1 && NR!=1{next;}{print}' *.txt

08

替换某一列的值

代码语言:javascript
复制
awk '{gsub(pattern,replace,$5)}1' in.file

09

查看一个文件有多少列

代码语言:javascript
复制
cat file.tsv | head -1 | tr "\t" "\n" | wc -l
awk '{print NF; exit}' file.tsv

010

检查文件是否所有的行的列数都是相同的

代码语言:javascript
复制
awk '{print NF}' test.txt | sort -nu | wc -l

011

统计每一列不同值的个数

代码语言:javascript
复制
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文件的操作,有兴趣的小伙伴们可以自行搜索哦。如果有特别的问题或需求,欢迎在评论区留言,我们很高兴来为大家分享简单快捷的生信文件处理方法!
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-11-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 生物信息学 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云开发 CloudBase
云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档