Linux 常用生信模板
目录
要点: 常用shell模板。
shell 常用语法
shell 数组
shell xargs的使用
##(1) 直接管道符流入的是字符串
$ find ../clean/*fq | wc
7 7 231
$ find ../clean/*fq | wc -
7 7 231 -
##(2) 使用xargs后流入的是文件名。
$ find ../clean/*fq | xargs wc
11892588 14865735 969517037 ../clean/c12_R2_trimmed.fq
...
## 下面效果同上。不过可以多次使用被替代变量。
## xargs 中的 -i启用占位符,使用默认占位符{},不能指定;而-I则需要手动指定替代符。
$ find ../clean/*fq | xargs -i wc {}
$ find ../clean/*fq | xargs -I - wc -
$ find ../clean/*fq | xargs -I {-} wc {-}
## 多次使用
$ ls /xx | xargs -t -I{} cp {} /tmp/{}
## -t : 打印内容,去掉\n之后的字符串
(3) 一个对比更明显的例子
$ echo '--help' | cat ## 相当于管道符|仅仅是把前一个的输出,重定向到后一个的输入。
--help
$ echo '--help' | xargs cat ##而加上 xargs后,则相当于 cat --help,就是把前一个的输出,当做后一个的命令参数。
Usage: cat [OPTION]... [FILE]...
Concatenate FILE(s) to standard output.
...
## 为什么这个能生效呢?比对和转bam排序一行搞定。
$ bwa mem -t 5 /data/wangjl/soft/GATK/resources/bundle/hg38/bwa_index/gatk_hg38.fasta c12.fq | samtools sort -@ 5 -o c12.bam -
$ samtools view c12.bam
ref:
https://www.jianshu.com/p/61242c8c0113
shell while 循环结构
常用循环结构。
$ ls >fileName.txt
$ cat fileName.txt | while read id; do echo $id; done;
c12.fq
c12.fq
c14.fq
## 把这个结构分解成多行,就是
$ cat fileName.txt | while read id;
do
## 这里是循环体,可以写很多语句
echo $id;
done;
# basename函数:去掉后缀名
$ echo ../clean/c12_R2_trimmed.fq | while read id; do echo $id; echo $(basename $id '_R2_trimmed.fq'); done;
../clean/c12_R2_trimmed.fq
c12
# basename函数:去掉后缀名,替换为新的后缀名
$ echo ../clean/c12_R2_trimmed.fq | while read id; do echo $id; echo $(basename $id '_R2_trimmed.fq').bam; done;
../clean/c12_R2_trimmed.fq
c12.bam
# 对几个自定义字符串循环
$ echo 'a1' 'a2' 'b2' | xargs -n 1 | while read id; do echo $id; done;
a1
a2
b2
shell for 循环
## 打印[17, 39]
# 类C风格
for ((i=17; i<=39; i ++))
do
echo $i;
done;
# in语句
for i in {17..39}
do
echo ${i};
done
# 使用seq: seq - print a sequence of numbers
for i in `seq 17 39`
do
echo $i;
done
# 分析常用
for id in {cell1,cell2,cell3} ##{}内不能有空格
do
echo ${id}
echo //${id}//
done;
输出:
cell1
//cell1//
cell2
//cell2//
cell3
//cell3//
# 更简练写法
for INDEX in 1 2 3 34 35;
do
echo $INDEX;
done;
# 定义内外双循环 (为什么交互式这么写报错,写到文件中OK,或者写成一行就OK?)
$ cat tx.sh
for type in `echo 'WT' 'KO' | xargs -n 1`
do
for ((i=1;i<=3;i++))
do
echo ${type}_${i}.fq;
done;
done;
$ bash tx.sh #输出同下面这一行
$ for type in `echo 'WT' 'KO' | xargs -n 1`; do for i in `seq 1 3`; do echo ${type}_${i}.fq; done; done;
WT_1.fq
WT_2.fq
WT_3.fq
KO_1.fq
KO_2.fq
KO_3.fq
注: for ((i=1;i<=3;i++)) 和 for i in `seq 1 3` 等价。
处理fastq
把fastq文件map到hg38上,并得到sort后的bam文件。
Usage: bwa mem [options] [in2.fq]
$ samtools --version
samtools 1.7
Using htslib 1.7-2
Copyright (C) 2018 Genome Research Ltd.
## 测试:使用循环输出文件名
$ find ../clean/*fq | while read id; do echo $id; done;
../clean/c12_ROW03_R2_trimmed.fq
## 测试:去掉文件名的路径
$ echo ../clean/c12_ROW03_R2_trimmed.fq | while read id; do echo $id; echo $(basename $id '_R2_trimmed.fq'); done;
../clean/c12_ROW03_R2_trimmed.fq
c12_ROW03
## 测试:1个文件 一行
$ echo ../clean/c12_ROW03_R2_trimmed.fq | while read id; do
echo $id;
bwa mem -t 10 /data/wangjl/soft/GATK/resources/bundle/hg38/bwa_index/gatk_hg38.fasta $id | samtools sort -@ 10 -o $(basename $id '_R2_trimmed.fq').bam -
done;
## 报错 samtools sort: couldn't allocate memory for bam_mem
## 测试2:1个文件,分成2行
$ echo ../clean/c12_ROW03_R2_trimmed.fq | while read id; do
echo $id;
cid=$(basename $id '_R2_trimmed.fq');
bwa mem -t 10 /data/wangjl/soft/GATK/resources/bundle/hg38/bwa_index/gatk_hg38.fasta $id > ${cid}.sam;
samtools sort -@ 10 -o ${cid}.bam ${cid}.sam;
done;
## 运行,分拆成几句:比对,并生成sort过的bam
$ cd align
$ find ../clean/*fq | while read filename;
do
echo $filename;
sampleID=$(basename $filename '_R2_trimmed.fq');
bwa mem -t 10 -R "@RG\tID:${sampleID}\tLB:mRNAseq\tPL:ILLUMINA\tPM:X10\tSM:${sampleID}" /data/wangjl/soft/GATK/resources/bundle/hg38/bwa_index/gatk_hg38.fasta $filename > ${sampleID}.sam;
samtools sort -@ 10 -o ${sampleID}.bam ${sampleID}.sam;
## rm ${sampleID}.sam
done;
## [main] Real time: 153.696 sec per file.
## bwa mem -t 5 /data/wangjl/soft/GATK/resources/bundle/hg38/bwa_index/gatk_hg38.fasta $id | samtools sort -@ 5 -o ${id}.bam -
处理 bam/sam
samtools: 单文件模式,shell批量模式。
# 常用语句:
samtools view -bS input.sam >aln.bam #1.sam转换为bam
samtools sort -o aln.sorted.bam aln.bam #2.排序
samtools index aln.sorted.bam #3.建索引
// 批量索引
$ ls *bam| while read id; do
echo $id;
samtools index ${id};
done;
生信人的Linux练习 https://www.jianshu.com/p/9dd75d848964