Linux文件排序和FASTA文件操作

文件排序

seq: 产生一系列的数字; man seq查看其具体使用。我们这使用seq产生下游分析所用到的输入文件。

# 产生从1到10的数,步长为1
$ seq 1 10
1
2
3
4
5
6
7
8
9
10
# 产生从1到10的数,步长为1,用空格分割
$ seq -s ‘ ‘ 1 10
1 2 3 4 5 6 7 8 9 10
# 产生从1到10的数,步长为2
# 如果有3个数,中间的数为步长,最后一个始终为最大值
$ seq -s ‘ ‘ 1 2 10
1 3 5 7 9
$ cat <(seq 0 3 17) <(seq 3 6 18) >test
$ cat test
0
3
6
9
12
15
3
9
15

sort: 排序,默认按字符编码排序。如果想按数字大小排序,需添加-n参数。

# 可能不符合预期的排序,系统首先排0,然后排1, 3, 6, 9
$ sort test
0
12
15
15
3
3
6
9
9
# 按数字大小排序
$ sort -n test
0
3
3
6
9
9
12
15
15

sort -u: 去除重复的行,等同于sort | uniq

$ sort -nu test
0
3
6
9
12
15

sort file | uniq -d: 获得重复的行(d = duplication)

$ sort -n test | uniq -d
3
9
15

sort file | uniq -c: 获得每行重复的次数。

# 第一列为每行出现的次数,第二列为原始的行
$ sort -n test | uniq -c
  1 0
  2 3
  1 6
  2 9
  1 12
  2 15

# 换一个文件看的更清楚
$ cat <<END >test2
> a
> b
> c
> b
> a
> e
> d
> a
> END

# 第一列为每行出现的次数,第二列为原始的行
$ sort test2 | uniq -c
      3 a
      2 b
      1 c
      1 d
      1 e

# 在执行uniq操作前,文件要先排序,不然结果很诡异
$ cat test2 | uniq -c
      1 a
      1 b
      1 c
      1 b
      1 a
      1 e
      1 d
      1 a

整理下uniq -c的结果,使得原始行在前,每行的计数在后。

awk是一个强大的文本处理工具,其处理数据模式为按行处理。每次读入一行,进行操作。OFS: 输出文件的列分隔符 (output file column separtor);FS为输入文件的列分隔符 (默认为空白字符)。awk中的列从第1到n列,分别记录为$1, $2 … $n。BEGIN表示在文件读取前先设置基本参数;与之相对应的是END,只文件读取完成之后进行操作。不以BEGIN, END开头的{}就是文件读取、处理的部分。

# awk的操作就是镀金上一步的结果,去除多余的空白,然后调换2列
$ sort test2 | uniq -c | awk ‘BEGIN{OFS="\t";}{print $2, $1}‘
a    3
b    2
c    1
d    1
e    1

对两列文件,安照第二列进行排序, sort -k2,2n。

# 第二列按数值大小排序
$ sort test2 | uniq -c | awk ‘BEGIN{OFS="\t";}{print $2, $1}‘ | sort -k2, 2n
c    1
d    1
e    1
b    2
a    3

# 第二列按数值大小排序
# 第二列相同的再按第一列的字母顺序的逆序排序 (-r)
# 注意看前3行的顺序与上一步结果的差异
$ sort test2 | uniq -c | awk ‘BEGIN{OFS="\t";}{print $2,$1}‘ | sort -k2,2n -k1,1r
e    1
d    1
c    1
b    2
a    3

FASTA序列提取

生成单行序列FASTA文件,提取特定基因的序列,最简单的是使用grep命令。主要用途是匹配文件中的字符串,以此为基础,进行一系列的操作。如果会使用正则表达式,将会非常强大。正则表达式版本很多,几乎每种语言都有自己的规则。

# 生成单行序列FASTA文件
$ cat <<END >test.fasta
> >SOX2
> ACGAGGGACGCATCGGACGACTGCAGGACTGTC
> >POU5F1
> ACGAGGGACGCATCGGACGACTGCAGGACTGTC
> >NANOG
> CGGAAGGTAGTCGTCAGTGCAGCGAGTCCGT
> END
$ cat test.fasta
>SOX2
ACGAGGGACGCATCGGACGACTGCAGGACTGTC
>POU5F1
ACGAGGGACGCATCGGACGACTGCAGGACTGTC
>NANOG
CGGAAGGTAGTCGTCAGTGCAGCGAGTCCGT

# grep匹配含有SOX2的行
# -A 1 表示输出的行中,包含匹配行的下一行 (A: after)
$ grep -A 1 ‘SOX2‘ test.fasta
>SOX2
ACGAGGGACGCATCGGACGACTGCAGGACTGTC

# 先判断当前行是不是 > 开头,如果是,表示是序列名字行,替换掉大于号,取出名字。
# sub 替换, sub(被替换的部分,要替换成的,待替换字符串)
# 如果不以大于号开头,则为序列行,存储起来。
# seq[name]: 相当于建一个字典,name为key,序列为值。然后就可以使用name调取序列。
$ awk ‘BEGIN{OFS=FS="\t"}{if($0~/>/) {name=$0; sub(">", "", name);} else seq[name]=$0;}END{print ">SOX2"; print seq["SOX2"]}‘ test.fasta
>SOX2
ACGAGGGACGCATCGGACGACTGCAGGACTGTC

多行FASTA序列提取要麻烦些,一个办法就是转成单行序列,用上面的方式处理。

sed和tr都为最常用的字符替换工具。

$ cat <<END >test.fasta
> >SOX2
> ACGAGGGACGCATCGGACGACTGCAGGACTGTC
> ACGAGGGACGCATCGGACGACTGCAGGACTGTC
> ACGAGGGACGCATCGGACGACTGCAGGAC
> >POU5F1
> CGGAAGGTAGTCGTCAGTGCAGCGAGTCCGT
> CGGAAGGTAGTCGTCAGTGCAGCGAGTCC
> >NANOG
> ACGAGGGACGCATCGGACGACTGCAGGACTGTC
> ACGAGGGACGCATCGGACGACTGCAGG
> ACGAGGGACGCATCGGACGACTGCAGGACTGTC
> ACGAGGGACGCATCGGACGACTGCAGGACTGT
> END

# 给>号开头的行的行尾加个TAB键,以便隔开名字和序列
# TAB键不可见,直接看看不大
# \(\)表示记录匹配的内容,\1则表示()中记录的匹配的内容
# 后面我们专门讲sed
$ sed ‘s/^\(>.*\)/\1\t/‘ test.fasta
>SOX2
ACGAGGGACGCATCGGACGACTGCAGGACTGTC
ACGAGGGACGCATCGGACGACTGCAGGACTGTC
ACGAGGGACGCATCGGACGACTGCAGGAC
>POU5F1
CGGAAGGTAGTCGTCAGTGCAGCGAGTCCGT
CGGAAGGTAGTCGTCAGTGCAGCGAGTCC
>NANOG
ACGAGGGACGCATCGGACGACTGCAGGACTGTC
ACGAGGGACGCATCGGACGACTGCAGG
ACGAGGGACGCATCGGACGACTGCAGGACTGTC
ACGAGGGACGCATCGGACGACTGCAGGACTGT

#使用cat -A 可以显示文件中所有的符号
# ^I 表示tab键
# $表示行尾
$ sed ‘s/^\(>.*\)/\1\t/‘ test.fasta | cat -A
>SOX2^I$
ACGAGGGACGCATCGGACGACTGCAGGACTGTC$
ACGAGGGACGCATCGGACGACTGCAGGACTGTC$
ACGAGGGACGCATCGGACGACTGCAGGAC$
>POU5F1^I$
CGGAAGGTAGTCGTCAGTGCAGCGAGTCCGT$
CGGAAGGTAGTCGTCAGTGCAGCGAGTCC$
>NANOG^I$
ACGAGGGACGCATCGGACGACTGCAGGACTGTC$
ACGAGGGACGCATCGGACGACTGCAGG$
ACGAGGGACGCATCGGACGACTGCAGGACTGTC$
ACGAGGGACGCATCGGACGACTGCAGGACTGT$

# 把所有的换行符替换为空格
# 主意第二个参数,引号内为空格
$ sed ‘s/^\(>.*\)/\1\t/‘ test.fasta | tr ‘\n‘ ‘ ‘
>SOX2     ACGAGGGACGCATCGGACGACTGCAGGACTGTC ACGAGGGACGCATCGGACGACTGCAGGACTGTC ACGAGGGACGCATCGGACGACTGCAGGAC >POU5F1     CGGAAGGTAGTCGTCAGTGCAGCGAGTCCGT CGGAAGGTAGTCGTCAGTGCAGCGAGTCC >NANOG     ACGAGGGACGCATCGGACGACTGCAGGACTGTC ACGAGGGACGCATCGGACGACTGCAGG ACGAGGGACGCATCGGACGACTGCAGGACTGTC ACGAGGGACGCATCGGACGACTGCAGGACTGT 

# 把最后一个空格替换为换行符
$ sed ‘s/^\(>.*\)/\1\t/‘ test.fasta | tr ‘\n‘ ‘ ‘ | sed -e ‘s/ $/\n/‘
>SOX2     ACGAGGGACGCATCGGACGACTGCAGGACTGTC ACGAGGGACGCATCGGACGACTGCAGGACTGTC ACGAGGGACGCATCGGACGACTGCAGGAC >POU5F1     CGGAAGGTAGTCGTCAGTGCAGCGAGTCCGT CGGAAGGTAGTCGTCAGTGCAGCGAGTCC >NANOG     ACGAGGGACGCATCGGACGACTGCAGGACTGTC ACGAGGGACGCATCGGACGACTGCAGG ACGAGGGACGCATCGGACGACTGCAGGACTGTC ACGAGGGACGCATCGGACGACTGCAGGACTGT

# 把  ‘ >‘替换为换行符 注意被替换的是 空格+大于号
# 当连用多个替换命令时,使用-e 隔开
$ sed ‘s/^\(>.*\)/\1\t/‘ test.fasta | tr ‘\n‘ ‘ ‘ | sed -e ‘s/ $/\n/‘ -e ‘s/ >/\n>/g‘
>SOX2     ACGAGGGACGCATCGGACGACTGCAGGACTGTC ACGAGGGACGCATCGGACGACTGCAGGACTGTC ACGAGGGACGCATCGGACGACTGCAGGAC
>POU5F1     CGGAAGGTAGTCGTCAGTGCAGCGAGTCCGT CGGAAGGTAGTCGTCAGTGCAGCGAGTCC
>NANOG     ACGAGGGACGCATCGGACGACTGCAGGACTGTC ACGAGGGACGCATCGGACGACTGCAGG ACGAGGGACGCATCGGACGACTGCAGGACTGTC ACGAGGGACGCATCGGACGACTGCAGGACTGT

# 把所有的空格替换掉
$ sed ‘s/^\(>.*\)/\1\t/‘ test.fasta | tr ‘\n‘ ‘ ‘ | sed -e ‘s/ $/\n/‘ -e ‘s/ >/\n>/g‘ -e ‘s/ //g‘
>SOX2    ACGAGGGACGCATCGGACGACTGCAGGACTGTCACGAGGGACGCATCGGACGACTGCAGGACTGTCACGAGGGACGCATCGGACGACTGCAGGAC
>POU5F1    CGGAAGGTAGTCGTCAGTGCAGCGAGTCCGTCGGAAGGTAGTCGTCAGTGCAGCGAGTCC
>NANOG    ACGAGGGACGCATCGGACGACTGCAGGACTGTCACGAGGGACGCATCGGACGACTGCAGGACGAGGGACGCATCGGACGACTGCAGGACTGTCACGAGGGACGCATCGGACGACTGCAGGACTGT

# 把TAB键转换为换行符
$ sed ‘s/^\(>.*\)/\1\t/‘ test.fasta | tr ‘\n‘ ‘ ‘ | sed -e ‘s/ $/\n/‘ -e ‘s/ >/\n>/g‘ -e ‘s/ //g‘ -e ‘s/\t/\n/g‘
>SOX2
ACGAGGGACGCATCGGACGACTGCAGGACTGTCACGAGGGACGCATCGGACGACTGCAGGACTGTCACGAGGGACGCATCGGACGACTGCAGGAC
>POU5F1
CGGAAGGTAGTCGTCAGTGCAGCGAGTCCGTCGGAAGGTAGTCGTCAGTGCAGCGAGTCC
>NANOG
ACGAGGGACGCATCGGACGACTGCAGGACTGTCACGAGGGACGCATCGGACGACTGCAGGACGAGGGACGCATCGGACGACTGCAGGACTGTCACGAGGGACGCATCGGACGACTGCAGGACTGT

或者简单点,直接用前面的awk略微做下修改。

# 差别只在一点
# 对于单行fasta文件,只需要记录一行,seq[name]=$0
# 对于多好fasta文件,需要把每一行序列都加到前面的序列上,seq[name]=seq[name]$0
$ awk ‘BEGIN{OFS=FS="\t"}{if($0~/>/) {name=$0; sub(">", "", name);} else seq[name]=seq[name]$0;}END{print ">SOX2"; print seq["SOX2"]}‘ test.fasta
>SOX2
ACGAGGGACGCATCGGACGACTGCAGGACTGTCACGAGGGACGCATCGGACGACTGCAGGACTGTCACGAGGGACGCATCGGACGACTGCAGGAC
时间: 2024-10-16 06:52:02

Linux文件排序和FASTA文件操作的相关文章

从gff3文件中获取fasta文件

chr1A NRGenome gene 1157233 1158291 . + . ID=TRIAE_CS42_U_TGACv1_641506_AA2096860.1.path1;Name=TRIAE_CS42_U_TGACv1_641506_AA2096860.1 chr1A NRGenome mRNA 1157233 1158291 . + . ID=TRIAE_CS42_U_TGACv1_641506_AA2096860.1.mrna1;Name=TRIAE_CS42_U_TGACv1_6

Linux下的删除过期文件操作

在实际的软件开发项目中,经常会有实现删除过期文件的需求.即要求程序能够自动删除多长时间之前生成的文件.本文提供了一个示例代码,为相关的开发工作提供了参考. 程序如下(本程序用makefile进行编译): /*********************************************************************** 版权所有 (C)2014, Zhou Zhaoxiong.* * 文件名称: TestFileDelete.c* 内容摘要: 用于演示Linux下过期

fasta文件中序列的排序

同样的名为read_1.fa 的fasta文件,里面有若干序列,如: >@r1TGAATGCGAACTCCGGGACGCTCAGTAATGTGACGATAGCTGAAAACTGTACGATAAACNGTACGCTGAGGGCAGAAAAAATCGTCGGGGACATTNTAAAGGCGGCGAGCGCGGCTTTTCCG>@r2NTTNTGATGCGGGCTTGTGGAGTTCAGCCGATCTGACTTATGTCATTACCTATGAAATGTGAGGACGCTATGCCTGTACCAAAT

linux 文件排序 sort

sort命令 sort命令是在Linux里非常有用,它将文件进行排序,并将排序结果标准输出.sort命令既可以从特定的文件,也可以从stdin中获取输入. 语法 sort(选项)(参数) 选项 -b:忽略每行前面开始出的空格字符: -c:检查文件是否已经按照顺序排序: -d:排序时,处理英文字母.数字及空格字符外,忽略其他的字符: -f:排序时,将小写字母视为大写字母: -i:排序时,除了040至176之间的ASCII字符外,忽略其他的字符: -m:将几个排序号的文件进行合并: -M:将前面3个

linux下日常较频繁需要操作的文件

1.linux下日常较频繁需要操作的文件: 网卡配置文件/etc/sysconfig/network-scripts/ifcfg-ethx注:不同品牌的服务器或者不同的系统版本之间,可能网卡名有所不同,配置时需要注意. DNS配置文件/etc/resolv.conf 远程配置文件/etc/ssh/sshd_config 防火墙配置文件/etc/sysconfig/iptables 日志文件/var/log/xx ;如secure记录登陆等安全日志:boot.log记录引导日志:messages记

Linux下C/C++的文件操作open、fopen与freopen

open是linux下的底层系统调用函数,fopen与freopen c/c++下的标准I/O库函数,带输入/输出缓冲.linxu下的fopen是open的封装函数,fopen最终还是要调用底层的系统调用open.所以在linux下如果需要对设备进行明确的控制,那最好使用底层系统调用(open), open对应的文件操作有:close, read, write,ioctl 等.fopen 对应的文件操作有:fclose, fread, fwrite, freopen, fseek, ftell,

linux下文件压缩与解压操作

对于刚刚接触Linux的人来说,一定会给Linux下一大堆各式各样的文件名给搞晕.别个不说,单单就压缩文件为例,我们知道在Windows下最常见的压缩文件就只有两种,一是,zip,另一个是.rap.可是Linux就不同了,它有.gz..tar.gz.tgz.bz2..Z..tar等众多的压缩文件名,此外windows下的.zip和.rar也可以在Linux下使用,不过在Linux使用.zip和.rar的人就太少了.本文就来对这些常见的压缩文件进行一番小结,希望你下次遇到这些文件时不至于被搞晕.

shell脚本判断linux文件修改时间后执行操作

判断linux文件修改时间后执行操作 创建脚本 vi /var/tomcat/find.sh #!/bin/bash a=`stat -c %Y /var/tomcat/logs/catalina.out`  //获取文件的修改时间(秒为单位) b=`date +%s`       //获取当前系统的时间 (秒为单位) if [ $[ $b - $a ] -gt 1800 ];   //判断当前时间和文件修改时间差(30分钟) then /sbin/service tomcat restart

Linux下基于文件描述符的文件操作(非缓冲)

1 文件描述符 内核为每个进程维护一个已打开文件的记录表(实现为结构体数组),文件描述符是一个较小的正整数(0-1023)(结构体数组下标),它代表记录表的一项,通过文件描述符和一组基于文件描述符的文件操作函数,就可以实现对文件的读.写.创建.删除等操作. 常用基于文件描述符的函数有open(打开).creat(创建).close(关闭).read(读取).write(写入).ftruncate(改变文件大小).lseek(定位).fsync(同步).fstat(获取文件状态).fchmod(权