【问题标题】:Memory efficient way to aggregate values that have the same key聚合具有相同键的值的内存有效方法
【发布时间】:2018-11-10 17:41:10
【问题描述】:

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

所以如果输入是

a,foo
b,bar
a,baz

输出应该是

a,foo baz
b,bar

【问题讨论】:

  • 欢迎来到 SO David,请将您的努力也添加到代码标签中,祝您学习愉快。
  • 如果不按键预排序,所有数据都需要保存在内存中才能找到匹配项。内存高效的方法是首先对数据进行排序......
  • @karakfa,BINGO,先生,我在帖子中也添加了该解决方案:)

标签: bash shell csv scripting


【解决方案1】:

解决方案 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}
}'

解决方案 2: 关注 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

【讨论】:

  • 你可以把prev","val改成prev FS val
  • @karakfa,很好,先生,现在在所有 3 个解决方案中都这样做了,干杯。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-07
  • 2022-06-15
  • 1970-01-01
相关资源
最近更新 更多