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