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参数替换

    参考:Linux 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

    $ basename /path/to/sampleid.fastq.gz .fastq.gz
    sampleid
    
    * perl解释器替换
    #将/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

    for i in *gz; do mv $i `echo $i |sed 's/L._...X...R//'`;done 
    
    将所有文件名重命名,list文件中第一列为原字符串、第二列为重命名字符串。
    $ 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文件展示

    https://github.com/alexhallam/tv

  • 删除特殊文件

    # 对于特殊字符列如<>\*开头的文件,删除加引号
    $ 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 
    
  • 大量小文件删除 https://cloud.tencent.com/developer/article/1647290

  • 终端记录 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 
    
本文阅读量  次
本站总访问量  次