当不同列中的连续单元格相等时,如何使用 shell 脚本计算列中的单词数!

Deb*_*raj 1 bash shell-script bioinformatics

当第 2 列、第 3 列和第 1 列中的连续单元格相同时,我尝试计算第 9 列中C_R和的数量。S_R该文件采用床格式(制表符分隔格式)。原始文件很大,第一列定义了染色体编号。文件的前几行看起来像这样,

chr1    10200   10300   8   10000   10214   100 214 S_R
chr1    10200   10300   8   10009   10233   100 224 S_R
chr1    10200   10300   8   10014   10220   100 206 S_R
chr1    10200   10300   8   10045   10215   100 170 S_R
chr1    10200   10300   8   10068   10209   100 141 S_R
chr1    10200   10300   8   10074   10300   100 226 C_R
chr1    10200   10300   8   10182   10283   100 101 S_R
chr1    10200   10300   8   10182   10387   100 205 C_R
chr1    10300   10400   4   10182   10387   100 205 S_R
chr1    10300   10400   4   10331   10467   100 136 S_R
chr1    10300   10400   4   10346   10461   100 115 S_R
chr1    10300   10400   4   10352   10468   100 116 S_R
chr1    10400   10500   3   10331   10467   100 136 S_R
chr1    10400   10500   3   10346   10461   100 115 S_R
chr1    10400   10500   3   10352   10468   100 116 S_R
chr1    11000   11100   2   11024   11163   100 139 S_R
chr1    11000   11100   2   11024   11188   100 164 S_R
chr1    11100   11200   3   11024   11163   100 139 S_R
chr1    11100   11200   3   11024   11188   100 164 S_R
chr1    11100   11200   3   11127   11296   100 169 S_R
chr1    11200   11300   1   11127   11296   100 169 S_R
chr1    11400   11500   2   11412   11561   100 149 S_R
chr1    11400   11500   2   11457   11608   100 151 S_R
chr1    11500   11600   3   11412   11561   100 149 S_R
chr1    11500   11600   3   11457   11608   100 151 C_R
chr1    11500   11600   3   11574   11744   100 170 S_R
chr1    11600   11700   3   11457   11608   100 151 S_R
chr1    11600   11700   3   11574   11744   100 170 C_R
chr1    11600   11700   3   11640   11815   100 175 S_R
chr1    11700   11800   4   11574   11744   100 170 S_R
chr1    11700   11800   4   11640   11815   100 175 C_R
chr1    11700   11800   4   11784   11963   100 179 S_R
chr1    11700   11800   4   11791   11936   100 145 S_R
Run Code Online (Sandbox Code Playgroud)

在上表的前 8 行中,第 1、2、3 列相同,因此暂定输出文件如下所示

chr1    10200   10300   2   6
chr1    10300   10400   0   4
chr1    10400   10500   0   3
chr1    11000   11100   0   2
chr1    11100   11200   0   3
chr1    11200   11300   0   1
chr1    11400   11500   0   2
chr1    11500   11600   1   2
chr1    11600   11700   1   2
chr1    11700   11800   1   3
Run Code Online (Sandbox Code Playgroud)

在输出文件中,第 4 列C_R和第 5 列是S_R

Sté*_*las 5

awk这可以通过以下方式完成:

awk 'function report() {
       if (n) print last_key, 0+count["C_R"], 0+count["S_R"]
     }
     {key = $1 OFS $2 OFS $3}
     key != last_key {report(); n = 0; split("", count); last_key = key}
     {count[$9]++; n++}
     END {report()}' <your-file
Run Code Online (Sandbox Code Playgroud)

如果输入字段是用制表符分隔的,您可能需要添加-F '\t' -v OFS='\t'以指定输入和输出文件分隔符。默认情况下FS(由 设置的输入字段分隔符-F)是一个空格字符,它具有特殊含义:任何空格序列分隔字段以及前导和尾随空格都将被丢弃,或者 IOW 字段是非空白字符序列,因此不能任何空白字段;andOFS也是一个空格,简单的意思是输出上的字段用一个空格分隔。