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
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也是一个空格,简单的意思是输出上的字段用一个空格分隔。