Ape*_*pex 3 bash awk dataframe
我有一个如下所示的数据框:
chr1,A,1,3,y,-
chr1,A,2,30,y,-
chr1,A,12,40,y,-
chr2,B,0,3,y,-
chr2,B,1,30,y,-
chr3,C,1,3,y,-
Run Code Online (Sandbox Code Playgroud)
我想按第二列进行分组,然后使用 bash 获取第三列的最小值和第四列的最大值。所以期望的输出应该是:
chr1,A,1,40,y,-
chr2,B,0,30,y,-
chr3,C,1,3,y,-
Run Code Online (Sandbox Code Playgroud)
我设法构建了一个粗略的代码来执行此操作,但它并没有完全给出最终输出。
这是代码:
awk 'BEGIN{FS=OFS=","} {if (!( $2 in min )) { min[$2] = $3; max[$2] = $4; row[$2] = $0 } else { if ($3 < min[$2]) min[$2] = $3; if ($4 > max[$2]) max[$2] = $4; row[$2] = $0 } } END { for (key in row) print row[key] }'
Run Code Online (Sandbox Code Playgroud)
我用这段代码得到的最终输出是:
chr1,A,2,30,y,-
chr2,B,1,30,y,-
chr3,C,1,3,y,-
Run Code Online (Sandbox Code Playgroud)
我怎样才能得到我想要的输出?有没有更简单的代码可以在 bash 中执行此操作?谢谢。
使用GNU datamash:
$ <ip.txt datamash -t, -g1,2 min 3 max 4 first 5-6
chr1,A,1,40,y,-
chr2,B,0,30,y,-
chr3,C,1,3,y,-
Run Code Online (Sandbox Code Playgroud)
-t,用作,字段分隔符-g1,2按第一列和第二列分组(假设它们始终与示例中所示相同)min 3获取第三列的最小值max 4获取第四列的最大值first 5-6对于最后两列,只需使用第一个实例