今天将生信工作中的一些常用命令记录(分享)如下:
(以后会不定期更新)
转换dos/windows格式的bed文件为unix格式
(说明:我们拿到的bed文件时常是客户在Windows系统下编辑好的,其行尾是\r\n,在进行NGS分析前最好将其转换为Unix风格的行尾\n。)
可以看出上面的dos.bed.txt是一个dos风格(^MKaTeX parse error: Can't use function '\r' in math mode at position 3: ,即\̲r̲\n结尾)的文件。要想转换成u…,即\n结尾)的文件,当然可以用dos2unix命令来完成:
dos2unix –n dos.bed.txt unix.bed.txt
可以看到转换成功。问题在于dos2unix命令往往不是系统默认安装的,你要自行安装后才可以使用。一个替代的方法是用sed命令。
sed ‘s/\r//’ dos.bed.txt > unix.bed.txt
可以看到,转换效果是一样的。
批量删除一个目录及其子目录下的bam文件
find your_path –name *.bam –exec rm {} \;
合并两个fastq文件
cat fastq1 fastq2 > merged_fastq
获取fastq文件名前缀
(假设fastq文件名是test.r1.fq.gz,我们想得到其前缀test)
your_string | cut –d. –f1
或者:
your_string | sed ‘s/\..*//’
或者:
your_string | awk –F. ‘{print $1}’
或者(如果是在脚本中实现这一功能的话):
利用shell中的字符串变量删除功能 ${var%%} 来实现。
打包并压缩项目文件
tar zcvf tar_file origin_files
打印行号
sed ‘=’ your_file | sed ‘N;s/\n/\t/’
或者:
awk ‘{printf(“%d\t%s\n”, NR, $0)}’ your_file
输出指定的行数
(比如第666行)
sed –n ‘666p;666d’ your_file
或者:
awk ‘NR==666{print $0; exit}’ your_file
统计不重复的基因个数
(假设基因名在第一列)
awk ‘{print $1}’ your_file | sort -u | wc –l
或者
awk ‘{a[$1]++} END {print length(a)}’ your_file
找出表达量最高的基因
(假设基因名在第一列,表达量数据在第四列)
sort –k4,4nr your_file | head -1 | cut –f1
或者(如果仅仅是找出最高表达量的基因,下面的方法更快!因为它不对所有记录排序):
awk ‘{if(max<$4){max=$4;gene=$1}} END {print gene}’ your_file
打印最后一列
awk ‘{print $NF}’ your_file
反向互补序列
(如”agctn”的反向互补序列应该是”nagct”)
your_string | tr ‘agctnAGCTN’ ‘tcganTCGAN’ | rev
或者:
your_string | sed ‘y/agctnAGCTN/tcganTCGAN/’ | rev
求取某一列平均值
(假设求第四列的平均值)
awk ‘{x+=$4} END {print x/NR}’ your_file
如果是压缩文件,则需利用zcat来生成“流”:
zcat your_zipped_file | awk ‘{x+=$4} END {print x/NR}’
获取脚本文件所在目录的绝对路径
(假设你有一个脚本test.sh,你想在该脚本里写几行代码获取test.sh所在目录的绝对路径)
abs_path=$(cd “$(dirname “$0”)”; pwd)
echo $abs_path
对bed文件排序
(假设依次按照前三列进行排序)
sort –k1,1V –k2,2n –k3,3n unsort.bed > sort.bed
最后提一句:从上面的诸多例子中,我们可以看出,sed与awk的威力。它们与grep并称Linux下的“三剑客”,牛叉哄哄!
下面的《sed与awk在线手册》是我一直想安利给大家的,网址如下(强烈推荐):
https://github.com/LinuxTOY/linuxtoy.org/blob/master/content/sed-awk.md
如果有任何意见或建议,欢迎留言!
公众号:生信了