linux shell常用命令速查

生成连续的自然数

seq 1 20 #输出是1,2……20,分隔符是换行符
seq -s "," 1 20 #输出是1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20 分割符是,
seq -s " " -w 1 13 #输出是01 02 03 04 05 06 07 08 09 10 11 12 13 这是宽格式数字,分隔符是空格
seq -w 1 20 #输出01,02,……20 默认分割符是换行符,输出的数字前面是有0的,用于宽格式。

查找指定大小的文件或文件夹

find . -name "*" -type f -size 0c | xargs -n 1 rm -rf #删除大小为0的文件夹
find . -name "*" -size 0c | xargs -n 1 rm -rf #删除大小为0的文件和文件夹
find . -name "*" -type f -size +10G | xargs -n 1 rm -rf #找到大于10G的文件,并删除。
find . -name "*.fpkm |xargs -i {} cp /tmp/fpkm/" #复制以.fpkm结尾的文件到新的目录/temp/fpkm目录里。

sed使用shell变量

sed "s/${filename}/${filename}.new/g" #使用shell变量的时候,需要使用双引号。

行尾添加字符TAIL

sed 's/$/&TAIL/g'

行首添加字符HEAD

sed 's/^/HEAD/g'

行首和行尾同时添加

sed 's/^/START/;s/$/END/g'

匹配字符串行首添加其他字符串

sed -i "/gene/ s/^/g\*/" file.txt #file.txt文件中包含gene的行,行首添加上g*字符串,这是直接修改源文件。

匹配奇数行或偶数行

cat 1.txt|sed -n '1~2p' #获取奇数行
cat 1.txt|sed -n '2~2p' #获取偶数行

匹配单引号(使用单引号包括\来转义')

sed 's/^>/sed -i '\''s\//g;' cds.fa #替换的字符中有单引号

序列大小写转换

sed '/^[a-z]/s/[a-z]/\u&/g' novel.fa #转换fasta的序列从小写变为大写字母
sed '/^[A-Z]/s/[A-Z]/\l&/g' novel.fa #转换大写为小写字母

sed匹配指定字符之间的内容

cat kegg1.txt |sed 's/\[.*\]//g' >kegg_des #匹配[]中括号包含的内容,删除中括号和其中的字符。
cat kegg1.txt |sed 's/\(.*\)//g' >kegg_des #匹配()小括号包含的内容,删除小括号和其中的字符。
cat genome.fa|sed 's/CM[0-9]\{2,6\}//g;s/, whole genome shotgun sequence//g;' >genome.new.fa #匹配CM后面是0-9的数字中2-6位数字,后一个是替换指定字符串, whole genome shotgun sequence
cat genome.fa|sed 's/CM[0-9]\{6\}//g;' >genome.new.fa #匹配CM后面是0-9的数字中6位数字

获取匹配行和前后行

grep -A 1 INT LTR.fa #获取包含INT的行和后一行(after)
grep -B 1 INT LTR.fa #获取包含INT的行和前一行(before)
grep -C 4 INT LTR.fa #获取包含INT的行和前后各4行(context)

去除重复行

sort -u file1cat file1|sort|uniq的作用都是去除重复行,注意:uniq使用前,需要sort
uniq -c file1显示该行出现的次数
uniq -u file1仅显示出现一次的行列
uniq -d file1仅显示重复出现的行

删除空白行

cat 1.txt|tr -s '\n' 要求文件格式是unix格式。

awk字符匹配

部分匹配

awk '$1 ~/Chr/ {print $0}' genome.gff 匹配第一列包含Chr字符的gff
awk '$1 !~/Chr/ {print $0}' genome.gff 匹配第一列不包含Chr的gff
awk '$1 ~/Chr/ && $4 <= 10000000 {print $0}' genome.gff 匹配各条Chr的前10M的gff
awk '$4 >=10000000 || $4 <= 100000000 {print $0}' genome.gff 匹配前10M或者大于100M的gff

精确匹配

awk '$4 ==10000000,$4 == 100000000 {print $0}' genome.gff 匹配10M到100M的gff 注意中间的逗号表示的是范围,,左右的就是对应的行的内容。提取的是这中间的行。
awk '$1 ==Chr1,$1 == Chr3 {print $0}' genome.gff 如果文件中是按照自然的Chr1,Chr2,Chr3这样的顺序排列,则会提取出第1列是Chr1到Chr3的所有的行。

awk if else判断

awk '{if($4<$5)print $1,$2,$3,$4,$5,$6,"+",$8,$9;else print $1,$2,$3,$5,$4,$6,"-",$8,$9}' InGenome.gff3|tr " " "\t" >genome.gff3

查看gff文件第9列有哪些字段

awk 'BEGIN{FS=OFS="\t"} $3=="gene"{split($9, a, ";"); for(i in a){split(a[i], b, "="); if(++c[b[1]]==1) print b[1]}}' GCF_000001405.33_GRCh38.p7_genomic.gff

awk使用shell里面的变量

注意:awk使用shell变量的时候,前面用-v 变量名=值 声明变量的赋值,后面使用的时候直接使用,不需要再使用$,awk里面普通字符串需要使用"字符串",变量不能被双引号包括。

abbr=$inputfile
awk -v abbr="${abbr}" '{print $1"_"abbr}' genome.id 

awk输出指定列到最后一列

分割符号是tab awk -F "\t" '{for (i=2;i<=NF;i++)printf("%s\t", $i);print ""}' file
分割符号是空格 awk -F " " '{for (i=2;i<=NF;i++)printf("%s ", $i);print ""}' file

awk里可以进行各种算数运算awk深入学习

awk '$3=="gene"{print $1,$4,$5,$5-$4}' test.bed #第5列减去第4列的值
awk '$3=="gene"{print $1,$4,$5,log($5)/log(10)}' test.bed #第5列取以10为底的对数
cat counts_num.bed| awk '{s[$1"\t"$2"\t"$3"\t"] += $4}END{ for(i in s){ print i, s[i] } }' #计算出第1-3列行内容一致的第4列对应的行的和。
awk '$3=="gene"{sum+= $5-$4+1}END{print sum}' Spo.gff3 #计算所有基因的总长度
awk '$3=="gene"{sum+= $5-$4+1;i+=1}END{print sum/i}' Spo.gff3 #计算所有基因的平均长度
cat Spo.genome.gff3|awk '$3=="exon" {split($9,a,"="); print a[3]}'|sort|uniq -c|awk '{sum+=$1}END{print sum/NR}' #统计基因的外显子数量
cat Sp.genome.gff3|awk '$3=="gene"{split($9,a,"=");print a[2]}' #第三列是gene,分割第9列,打印出分割后的第二个字符。
paste -d "\t" <(cat Sp.genome.gff3|awk '$3=="gene"{split($9,a,"=");print a[2]}') <(cat Sp.genome.gff3|awk '$3=="gene"{print $1"\t"$4"\t"$5}') >sp.genes#提取一个基因组的所有基因和位置信息
cat counts_num.bed| awk '{s[$1"\t"$2"\t"$3"\t"] += $4;b[$1"\t"$2"\t"$3"\t"] += 1}END{ for(i in s){ print i, s[i],b[i] } }'|awk '{print $1"\t"$2"\t"$3"\t"log($4/$5)/log(10)}'#提取第1-3列相同的行在第4列的值的和/对应的行数(即均值),然后再取以10为底的对数。其实$5就是基因密度。

输出第一列中字符长度大于15的行

awk 'length($1)>15'

行列转置

awk 'BEGIN{c=0;} {for(i=1;i<=NF;i++) {num[c,i] = $i;} c++;} END{ for(i=1;i<=NF;i++){str=""; for(j=0;j0){str = str" "} str= str""num[j,i]}printf("%s\n", str)} }' file

awk重命名fasta文件

awk 'FNR==NR{a[">"$1]=$2;next} $1 in a{ sub(/>/,">"a[$1]" ",$1)}1' name.list protein.fa name.list需要有两列,第一列是原来的ID,第二列是新的ID.protein.fa是需要重命名的fasta文件

按行合并文件

cat file1 file2 >file0

按列合并文件

paste file1 file2 >file0

指定分隔符,按列合并文件

paste -d "\t" file1 file2 >file0

cut获取指定列

cut -f 2-8 file1 获取以tab分割的第2到8列
cut -d, -f 1-3 3.csv 获取以,分割的csv文件的第1到3列。

sed输出文件指定行

sed -n '3,101p' 3.csv 获取第3到101行。
cat 3.csv|sed '1,5d' 输出删除1-5行后的内容。
cat 3.csv|sed -e '3,$d'删除第3到最后1行
cat 3.csv|sed '2,5c No 2-5 number' 替换第2-5行的内容为No 2-5 number
cat 3.csv|sed '1c\test' 替换第1行的内容为test
cat 3.csv|sed '1a\test1' 在第1行下一行插入新的一行内容是test1
cat 3.csv|sed '1,3a\test1'在第1-3行每行之后插入新一行
cat 3.csv|sed '1i/test1' 在第1行上一行插入新的一行内容是test1
cat 3.csv | sed -e '/motif/d'删除包含字符串’motif‘的行。
sed '1~2 s/aaa/bbb/' filename 修改奇数行的内容
sed '2~2 s/aaa/bbb/' filename 修改偶数行的内容
sed '3~5 s/aaa/bbb/' filename 修改第3行的内容,间隔5行的第3行,即3,8,13,18……行。(等差数列)

合并两个文件(合并之前,先用sort排序)

join plant.tab 2.tab -t $'\t' >test.tab 指定输出分隔符为tab
sort -k2 cdd.xls >cdd.xls.sort根据第2列进行排序
sort -k1 cddid.tbl >cddid.sort根据第1列进行排序
join -a 1 -1 2 -2 1 cdd.xls.sort cddid.sort -t $'\t' >cdd.final.xls
匹配第1个文件的第2列(-1 2)和第2个文件的第1列(-2 1)一致的行,同时输出第1个文件中未匹配的行-a 1,使用tab作为分割符$'\t'
join -o 1.1 2.3 cdd.xls.sort cddid.sort -t $'\t' >cdd 输出匹配的第一个文件的第一列-o 1.1和第二个文件的第3列2.3

匹配两个文件

grep -f file1 file2 #匹配file1和file2中包含相同内容的行,输出file2中这些行的内容。
grep -v -f file1 file2 #匹配file1和file2中不同内容的行,输出file2中这些行的内容。

比较两个文件的不同
comm -1 file1 file2 文件需要先sort,按列输出不同。参数:-123 -1表示不显示只在file1中出现的列,-2不显示只在file2中出现的列,-3不显示file1和file2共有的列。
comm -3 file1 file2 '文件需要先sort,输出的是文件1和2共有的列,但是是分布在两列,需要用sed替换tab。
diff log2013.log log2014.log -y -W 50 按行输出两个文件的不同,-y是以并列的方式显示文件的异同之处 -W 50是指定栏宽。

检测数据格式(检测字段数是否一致) (datamash需要单独安装)

datamash check

文件压缩和解压缩pigz pigz支持多线程,速度比gzip,bzip2快的多。

压缩 pigz -k -9 -p 48 sample.bam > bam.tar.gz -k是保留源文件 -9是指定压缩比例,-11是最大压缩比例,-0是最小压缩比率。 -p 指定线程数量
打包压缩 tar cvf - 目录名 | pigz -k -9 -p 48 > bam.tar.gz
解压缩unpigz -p 48 bam.tar.gz

多线程(大数据量的时候,能大大加快速度)

安装Parallel,启用多线程。参考 用法

wget https://ftp.gnu.org/gnu/parallel/parallel-20190122.tar.bz2
tar jxvf parallel-20190122.tar.bz2
cd parallel-20190122
./configure -prefix=~/software/
make -j 8
make install

parallel支持标准输出运行和命令调用运行。
cat jobs2run jobs2run是要运行的命令脚本

bzip2 oldstuff.tar
oggenc music.flac
opusenc ambiance.wav
convert bigfile.tiff small.jpeg
ffmepg -i foo.avi -v:b 12000k foo.mp4
xsltproc --output build/tmp.fo style/dm.xsl src/tmp.xml
bzip2 archive.tar

多线程方式1:parallel --jobs 6 < jobs2run
多线程方式2:
bzip原始
cat bigfile.bin | bzip2 --best > compressedfile.bz2
bzip使用多线程
cat bigfile.bin | parallel --pipe --recend '' -k bzip2 --best > compressedfile.bz2
grep原始
grep pattern bigfile.txt
grep多线程
cat bigfile.txt | parallel --block 1M --pipe grep 'pattern'
1M是指每个cpu运行的100万行。会把任务按照这个值,分配给各个cpu.
awk原始
cat rands20M.txt | awk '{s+=$1} END {print s}'
awk多线程
cat rands20M.txt | parallel --pipe awk \'{s+=\$1} END {print s}\' | awk '{s+=$1} END {print s}'
wc原始
wc -l bigfile.txt
wc多线程
cat bigfile.txt | parallel --pipe wc -l | awk '{s+=$1} END {print s}'
sed原始
sed s^old^new^g bigfile.txt
sed多线程
cat bigfile.txt | parallel --pipe sed s^old^new^g

速度对比

grep>awk>sed,cut
sed和cut速度比较慢。grep -f 也比较慢。sed不支持多线程,sed是按行操作,多线程会出问题。

多行fasta转单行

cat test.fa | tr '\n' '\t' |sed 's/\t>/\n>/g'|sed 's/\t/\n/'|sed 's/\t//g'|sed '$s/$/$\n/' 先替换\n为\t.然后把\t>这个是头部转回\n>,注意第二次sed是只替换一次,就把每行第一个\t换成\n,然后把全局的\t删除。第4个sed是在文件末尾添加上换行符(多次使用sed,速度慢)
awk '/^>/&&NR>1{print ""}{printf "%s",/^>/?$0"\n":$0}END{print ""}' test.fa awk速度比较快
命令讲解:
/^>/&&NR>1匹配>开头且行号大于1的输出换行符
/^>/?$0"\n":$0是判断是否>开头,是输出本行和换行,否,则输出本行。再用printf打印出来,但是这样输出的每个序列的末尾没有换行符。所以才有前一个判断只要不是第一行>,都先输出一个换行符。
END{print ""}是在文档最后输出一个换行。
更多生物信息学的one liner https://github.com/stephenturner/oneliners#etc

文本行数超过3万行,linux许多命令会报错Argument list too long

解决方案,使用findxargs参考地址。
find ./result_dir -name "*.kaks" |xargs cat |cut -f 1,3,4,5 | grep -v 'Sequence' >All_kaks.txt
find ./result_dir -name "*.axt.one-line"|while read id;do calculate_4DTV_correction.pl $id >${id%%one-line}4dtv;done 计算4DTv。

多进程并行运行

多线程工具parallel是系统自带的,ParaFly一般的linux系统也自带

ParaFly的有点就是,可以重跑。比如运行下面的命令,用于批量压缩文件,当然pigz可以代替gzip,实现多线程

ls *.fq | while read fq; do echo "gzip ${fq}";done > gzip_fq.sh
nohup ParaFly -c gzip_fq.sh -CPU 8 -failed_cmds gzip_fq.sh.failed &

如果上面的压缩命令失败了,会输出到gzip_fq.sh.failed文件,调整后再次nohup ParaFly -c gzip_fq.sh -CPU 8 -failed_cmds gzip_fq.sh.failed &即可自动跳过已经运行成功的命令,只运行识别的命令。这在流程的断点继续分析中非常有用。
nohup parallel -j 8 < 2.sh & 一次运行脚本2.sh里的8行命令,即使用8个cpu。2.sh里是有n行需要并行执行的程序。

快速删除空行的速度对比

genome.fa文件大小是4G.

运行命令 时间
time grep -v '^$' genome.fa >genome.grep.fa 13.45s
time sed '/^$/d' genome.fa >genome.sed.fa 19.565s
time tr -s "n" genome.fa >genome.tr.fa >3min
time awk '/./ {print}' genome.fa >genome.awk.fa 21.971s
time sed -i '/^$/d' genome.fa 18.693s

你可能感兴趣的:(linux shell常用命令速查)