linux tricks
- 列转换成行
#每行用逗号分隔 cat file.txt |tr "\n" ","|sed -e 's/,$/\n/' #每行用空格分隔 cat file.txt |tr "\n" " "|sed -e 's/ $/\n/'
- 找到当前目录下含有字符串 rice 的文件
find . -type f|xargs -i grep -H "rice" {}
shell参数替换
用法比较多,这里举个例子
${parameter%word}
${parameter%%word}
从尾开始扫描word,将匹配word正则表达式的字符过滤掉
%为最短匹配,%%为最长匹配
如下面的用法可以方便地去掉后缀提取样本id
ls raw/*_1.fastq.gz|while read i ;do id=${i%%_1.fastq.gz} bsub -J bwa_${id} -n 10 -o ${id}.out -e ${id}.err "bwa mem -t 8 ref.fa ${id}_1.fastq.gz ${id}_2.fastq.gz | samtools sort -@8 -o ${id}_srt.bam" done
basename 取样本名
basename
显示 去掉 目录成分 后的NAME
. 如果 指定了SUFFIX
, 就 同时 去掉 拖尾的SUFFIX
。* perl解释器替换$ basename /path/to/sampleid.fastq.gz .fastq.gz sampleid
#将/usr/local/bin/perl -w 替换为/usr/bin/env perl perl -p -i -e 's#/usr/local/bin/perl -w#/usr/bin/env perl#' scripts/*pl #将/usr/local/bin/perl -w 替换为/usr/bin/env perl for i in `find ./ -name "*.pl"`;do sed -i "s/bin\/perl /bin\/env perl/g" $i ;done
shell脚本执行错误自动退出
写较长的流程shell脚本,可能会遇到中间执行错误,此时脚本仍然会往后继续执行,在脚本开头加入
set -e
命令可以使脚本出错即停止运行.#!/bin/bash set -e
不规则文件重命名
将类似
D33-1_L2_123X45.R2.fastq.gz
的文件批量重命名为D33-1_2.fastq.gz
。将所有文件名重命名,list文件中第一列为原字符串、第二列为重命名字符串。for i in *gz; do mv $i `echo $i |sed 's/L._...X...R//'`;done
$ awk '{print "rename '' "$1" "$2" '' *.gz"}' list |sh
grep命令加速
服务器现有版本(2.2)的grep匹配多行的pattern list的时候非常慢,如代码:
grep -vwf position_list genotype.csv > filtered.genotype
如果这个pettern和文件上万行的话,总时长超过了数个小时,3.2之后的grep大概只用1s。
集群上安装了最新的版本 module load grep/3.3
少量数据测试结果如下:
$ time grep -vwf Chr01.bad_list_4000 splitChr01_1000.csv > test real 0m12.384s user 0m12.125s sys 0m0.223s $ module load grep/3.3 $ time grep -vwf Chr01.bad_list_4000 splitChr01_1000.csv > test real 0m0.015s user 0m0.006s sys 0m0.007s
scp 后台下载数据
使用scp在不同服务器之间传数据,当数据量很大时,scp需要传很久,为防止掉线,可能想用nohup &的方法将scp放在后台运行,但实际做起来发现行不通。我们可以采用下面的方法。
nohup scp file username@ip:/home/username/dir
然后输入密码开始传数据- 按下
ctrl+z
- 使用jobs命令查看作业号,比如scp的作业号为1。然后bg %1,则可将scp任务放入后台,不用担心掉线
如果忘了使用nohup命令,则可以使用disown命令来补救,参见这篇文档 Linux 技巧:让进程在后台可靠运行的几种方法
这种情况也可以使用rsync传数据,可自动跳过已经传完的数据;使用screen 防止网络不稳定掉线
tv
csv文件展示
删除特殊文件
# 对于特殊字符列如<>\*开头的文件,删除加引号 $ rm "<>\*" rm: remove regular file ‘<>\\*’? y # 对于-开头的文本,删除使用- - # 使用删除加目录也可以,rm ./-B.file $ rm -- -B.file rm: remove regular file ‘-B.file’? y # 对于特殊字符!*,要增加转义字符 # linux中很多字符有着特殊的含义,在前面加上转义字符,就可以当成普通字符使用。 $ rm \!* rm: remove regular file ‘!*’? y # 按照节点号删除 # 乱码文件删除可使用这种方式 $ ls -i ./-B.file 1446218 ./-B.file $ find ./ -inum 1446218 -exec rm {} \;
- 替换换行符/多行变单行的几种方法
# 用xargs为echo传入参数,默认是把换行符替换成空格【推荐】 cat file.txt | xargs echo # 用tr把换行符替换成空格【推荐】 cat file.txt | tr '\n' ' ' # 用paste替换;-s是一次处理文件的所有行,而非并行处理每一行;-d指定分割符 cat file.txt | paste -sd " " # 用sed处理;sed按行处理所以每次处理会自动添加换行符,:a在代码开始处设置标记a,代码执行结尾处通过跳转命令ta重新跳转到标号a处,重新执行代码,递归每行;N表示读入下一行【很慢】 sed ':a;N;s/\n/ /g;ta' file.txt # 用awk处理;ORS(Output Record Separator)设置输出分隔符,把换行符换成空格。head -c -1代表截取文件除了最后一个字符的字符,用于去掉文本末多的分隔符,根据情况使用 awk 'ORS=" "' file.txt |head -c -1 # 用awk处理,将RS(record separator)设置成EOF(end of file),即将文件视为一个记录;再通过gsub函数将换行符\n替换成空格 awk BEGIN{RS=EOF}'{gsub(/\n/," ");print}' file.txt
终端记录 script 可以记录终端中所有的操作和输出,方便做分析记录。
程序日志
跑程序时如需要需要记录日志,可以用两种方式。
方法1:
记录单行命令的日志
$ { gatk HaplotypeCaller --native-pair-hmm-threads 64 -L chr20 -R hg38.fa -I ERR194146_sort_redup.bam -O ERR194146.vcf.gz ;} 2>&1 | tee gatk_hc.log
方法2:
记录脚本的日志
#!/bin/bash logfile=gatk_hc.log exec >$logfile 2>&1 gatk HaplotypeCaller --native-pair-hmm-threads 64 -L chr20 -R hg38.fa -I ERR194146_sort_redup.bam -O ERR194146.vcf.gz
本站总访问量 次