我的输入是以下排序的 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