Shell命令实战详解

1、按照指定的某段路径,进行数据拷贝。

=> head Assembly.txt 

/ifs1/ST_ENV/USER/liyiyuan/liushanlin/1KITE_1_2/110817_I809_FCD05CDACXX_L3_INSbusTBARABPEI-119/e3/gap/e3.scafseq_200 

/ifs1/ST_ENV/USER/liyiyuan/liushanlin/1KITE_1_2/110817_I809_FCD05CDACXX_L3_INSbusTBCRABPEI-135/e3/gap/e3.scafseq_200 

/ifs1/ST_ENV/USER/liyiyuan/liushanlin/1KITE_1_2/110817_I809_FCD05CDACXX_L3_INSbusTBDRAAPEI-79/e3/gap/e3.scafseq_200 

/ifs1/ST_ENV/USER/liyiyuan/liushanlin/1KITE_1_2/110817_I809_FCD05CDACXX_L3_INSbusTBFRABPEI-126/e3/gap/e3.scafseq_200 

/ifs1/ST_ENV/USER/liyiyuan/liushanlin/1KITE_1_2/110817_I809_FCD05CDACXX_L3_INSbusTBGRABPEI-127/e3/gap/e3.scafseq_200 

/ifs1/ST_ENV/USER/liyiyuan/liushanlin/1KITE_1_2/110817_I809_FCD05CDACXX_L3_INSbusTBHRABPEI-138/e3/gap/e3.scafseq_200 

/ifs1/ST_ENV/USER/liyiyuan/liushanlin/1KITE_1_2/110817_I809_FCD05CDACXX_L3_INSbusTBIRAAPEI-84/e3/gap/e3.scafseq_200 

/ifs1/ST_ENV/USER/liyiyuan/liushanlin/1KITE_1_2/110817_I809_FCD05CDACXX_L3_INSbusTBJRAAPEI-85/e3/gap/e3.scafseq_200 

/ifs1/ST_ENV/USER/liyiyuan/liushanlin/1KITE_1_2/110817_I809_FCD05CDACXX_L3_INSbusTBKRAAPEI-76/e3/gap/e3.scafseq_200 

/ifs1/ST_ENV/USER/liyiyuan/liushanlin/1KITE_1_2/110817_I809_FCD05CDACXX_L3_INSbusTBLRAAPEI-77/e3/gap/e3.scafseq_200

#在当前目录把liushanlin/下的数据按照原相对路径进行同步拷贝

=> cat Assembly.txt|while read i;do a=`echo $i|awk -F 'liushanlin/' '{print $2}'`;b=`echo $a|awk -F '/[^/]*$' '{print $1}'`;mkdir -p $b;rsync -avzP $i ./$b;echo -e "Finished:$i\t$b" >>rsync.log;done 

2、解析路径获取文件名和目录名。

    获取文件名

     #awk解法:用“/”做分隔符,然后打印出最后的那一部分。

resFile=`echo /tmp/csdn/zhengyi/test/adb.log | awk -F "/" '{print $NF}'`

    #官方解法(basename):Bash Shell本身提供了basename命令,可以直接获取路径名最后的文件名。

resFile=`basename /tmp/csdn/zhengyi/test/adb.log`

    获取目录名

    #awk解法:可以灵活的使用分隔符,混合正则表达式。

dirPath=`echo /tmp/csdn/zhengyi/test/adb.log | awk -F '/[^/]*$' '{print $1}'`
       #awk+for循环的方法
echo /tmp/csdn/zhengyi/test/adb.log | awk 'BEGIN{res=""; FS="/";}{ for(i=2;i<=NF-1;i++) res=(res"/"$i);} END{print res}'

    #官方解法(basename):Bash Shell本身提供了dirname命令,特别方便,可以直接获取路径对应的目录名。

dirPath=`dirname /tmp/csdn/zhengyi/test/adb.log`

3、Soap文件中求出每个染色体的总测序长度(即第6列的加和)。

=> head test.soap

SIMU_0001_00000001/2    AAATATGTGGATATAAACACATTCCTAAATAACCG     hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh     1       a       35      -       chr1    55537   1   A->11T40 35M     11A23

SIMU_0001_00000002/2    CCGGGGCCCAGCGCAGGGGCTGATGAGAAGGCACT     hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh     1       a       35      -       chr2    46589   0   35M      35

SIMU_0001_00000003/2    TTCCCCTTTGATCTGATGTCCACCTGGAAACCGTG     hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh     1       a       35      -       chr2    37337   0   35M      35

SIMU_0001_00000004/2    TTTATATGGTGTTAGCCTTTCTTCCAAATTTTAAG     hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh     1       a       35      -       chr3    27365   1   A->14G40 35M     14A20

SIMU_0001_00000005/2    ACCCATGGCAGACCCCCTTATCTTAACTCAAGTGT     hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh     1       a       35      -       chr1    11736   1   A->2C40  35M     2A32

SIMU_0001_00000006/2    GCTTACACTGGAATTAACAAGTTTTAGTATATTAT     hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh     1       a       35      -       chr10   53007   0   35M      35

SIMU_0001_00000009/2    TTTTCTTCTATGAAGTTTGGGAGAAAAGTCAAGAT     hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh     1       a       35      -       chr1    91644   0   35M      35

SIMU_0001_00000010/2    GGTCACCACAGAATATGATATAAATAAGATAAATA     hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh     1       a       35      -       chr2    77211   0   35M      35

SIMU_0001_00000011/2    TACTTTTGGATTATATGCTAAACAGTGTGACTATA     hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh     1       a       35      -       chr1    60759   0   35M      35

SIMU_0001_00000013/2    TTCCCTGGTAAGGGCTCATGCCTTGGCACTGAGGG     hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh     1       a       35      -       chr12   90043   0   35M      35    

    #awk代码实现:

=> head test.soap |awk '{a[$8]+=$6}END{for (i in a) print i,"\t",a[i]}'

chr10    35

chr12    35

chr1     140

chr2     105

chr3     35

4、Linux下用awk计算Fasta序列的长度

=> cat contig.fa

>1 cvg_0.0_tip_0

ATTTTGGCTTTGGAAGGGC

>3 cvg_0.0_tip_0

GAATAGTGATACAAATTATATAGTTTCAAGTATGTGACTTGAACATGAGATTAT

>5 cvg_0.0_tip_0

TAATCTAGGCTTGAAACTATATAATTTGTATCACTATTCTAAGGATTTTTTT

首先通过下面的命令将fasta序列转换成一行显示,命令如下:

=> awk '/^>/&&NR>1{print "";}{ printf "%s",/^>/ ? $0" ":$0 }'  contig.fa

或者:

=> awk '{ printf "%s",/^>/ ? $0" ":$0"\n" }' contig.fa

得到如下结果:

image

如果想直接显示每条序列的长度,可以运行如下命令:

=> awk '/^>/&&NR>1{print "";}{ printf "%s",/^>/ ? $0" ":$0 }'  contig.fa |awk '{print $1"\t"length($3)}'

得到结果如下:

>1      19

>3      54

>5      52

你可能感兴趣的:(shell命令)