内存有效的方法来聚合具有相同密钥的值

时间:2018-05-31 16:29:35

标签: bash shell csv scripting

我有一个包含一些重复键的CSV文件。我想对这些密钥进行重复数据删除,并将所有值保存在一起。

所以如果输入是

a,foo
b,bar
a,baz

输出应为

a,foo baz
b,bar

1 个答案:

答案 0 :(得分:1)

解决方案第一: 不使用数组,首先对Input_file进行排序(使所有第一个字段连续出现),然后根据OP的请求收集值。记忆力很高)

sort -s -t, -k1,1 Input_file |
awk -F, '
prev!=$1 && prev{
  print prev FS val;
  prev=val=""}
{
  val=val?val OFS $NF:$NF;
  prev=$1
}
END{
  if(val){
    print prev FS val}
}'

解决方案第二: 关注awk可能会对您有所帮助。它可能不会以第一个字段进入Input_file的顺序给出输出(与第三个字段相比,这可能更有效,因为它只使用单个数组)。

awk -F, '{a[$1]=a[$1]?a[$1] OFS $NF:$NF} END{for(i in a){print i FS a[i]}}' Input_file

解决方案3: 关注awk会以第一个字段输入Input_file的顺序输出。

awk -F, '
!b[$1]++{
  c[++count]=$1}
{
  a[$1]=a[$1]?a[$1] OFS $NF:$NF
}
END{
  for(i=1;i<=count;i++){
    print c[i] FS a[c[i]]}
}' Input_file