【问题标题】:How can I put CSV files in a array in bash?如何将 CSV 文件放入 bash 中的数组中?
【发布时间】:2019-03-30 15:13:18
【问题描述】:

所以我需要将 CSV 文件的某些列的内容放入一个数组中,以便对它们进行操作。 我的文件如下所示:

userID,placeID,rating,food_rating,service_rating
U1077,135085,2,2,2
U1077,135038,2,2,1
U1077,132825,2,2,2
U1077,135060,1,2,2
U1068,135104,1,1,2
U1068,132740,0,0,0
U1068,132663,1,1,1
U1068,132732,0,0,0
U1068,132630,1,1,1
U1067,132584,2,2,2
U1067,132733,1,1,1
U1067,132732,1,2,2
U1067,132630,1,0,1
U1067,135104,0,0,0
U1067,132560,1,0,0
U1103,132584,1,2,1
U1103,132732,0,0,2
U1103,132630,1,2,0
U1103,132613,2,2,2
U1103,132667,1,2,2
U1103,135104,1,2,0
U1103,132663,1,0,2
U1103,132733,2,2,2
U1107,132660,2,2,1
U1107,132584,2,2,2
U1107,132733,2,2,2
U1044,135088,2,2,2
U1044,132583,1,2,1
U1070,132608,2,2,1
U1070,132609,1,1,1
U1070,132613,1,1,0
U1031,132663,0,0,0
U1031,132665,0,0,0
U1031,132668,0,0,0
U1082,132630,1,1,1

我想获取 PlaceID 并将其保存在一个数组中,并且在同一位置也放置评级。我需要做的是获得每个 PlaceID 的平均评分。

我一直在尝试类似的东西

cut -d"," -f2  FileName >> var[@]

【问题讨论】:

  • 使用 bash 并非不可能,但我会使用 awk 来完成这项任务。

标签: arrays bash shell


【解决方案1】:

在 bash 中很难完成,但在 awk 中非常简单:

awk -F',' 'NR>1 {sum[$2] += $3; count[$2]++}; END{ for (id in sum) { print id, sum[id]/count[id] } }' file.csv

解释:-F 设置字段分隔符,您希望字段 2 和字段 3 的平均值。最后我们打印唯一 ID 和平均值。我们处理除第一行以外的所有行(行号超过 1)。

【讨论】:

  • 我建议将/^ U*/改为NR>1,这种情况下不需要模式匹配。
  • 谢谢@oguzismail
  • 好吧,这是我必须为我的班级做的事情,他们不想要 awk,这让我很困惑。
猜你喜欢
  • 2015-02-03
  • 2016-09-07
  • 1970-01-01
  • 2013-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-18
相关资源
最近更新 更多