如何根据一列的值聚合 CSV 中的行

如何根据一列的值聚合 CSV 中的行

我的输入是以下排序的 CSV 文件(用作:字段分隔符而不是通常的逗号):

version:device
1.0.0:dev1
1.0.0:dev2
1.2.3:dev3
1.3.4:dev4
1.3.4:dev5

我想聚合它,使每个版本都在 1 行中:

version:devices
1.0.0:dev1,dev2
1.2.3:dev3
1.3.4:dev4,dev5

答案1

使用 GNUdatamash按第一个冒号分隔的字段进行分组,折叠第二个字段:

$ datamash -t : groupby 1 collapse 2 <file
version:device
1.0.0:dev1,dev2
1.2.3:dev3
1.3.4:dev4,dev5

答案2

是一个非常神奇的工具:

mlr --csv --fs : group-by version then nest --ivar , -f device file.csv
version:device
1.0.0:dev1,dev2
1.2.3:dev3
1.3.4:dev4,dev5

答案3

尝试

awk -F: '$1 == before { printf ",%s",$2 ; } 
         $1 != before { printf "%s%s",nl,$0 ; before=$1 ; nl="\n" } 
         END {printf nl ; }' 

在哪里

  • -F:告诉 awk 用作:分隔符
  • printf不打印换行符,除非 tol ( "\n")
  • 这可以是单行的(例如awk -F: '....' file),为了便于阅读,我将行分开。

这使用两个变量来保存新行 ( nl) 和前$1一行的值。

答案4

awk -F: -v OFS=: '
    NR == 1{print;next} 
    !v {v=$1;d=$2;next} 
    v == $1 {d = d","$2}
    v != $1 {print v,d;v=$1;d=$2}
    END{print v,d}
' file

相关内容