按列分组并使用 bash 创建新的数据框

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 中执行此操作?谢谢。

Sun*_*eep 5

使用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对于最后两列,只需使用第一个实例