使用命令行工具根据唯一 ID 聚合 CSV 数据

Ian*_*ton -2 bash awk command-line join sed

我想集合数据从一个CSV文件到另一个,使用命令行工具,如bashsedawk等等中的每个文件中的每一行与一个唯一的ID开始在第1列,并且如果在所述目的地的行该ID相匹配,则行应该被替换,否则应该附加。输入数据未排序,但结果的排序顺序无关紧要,因此如果有帮助,文件可以作为脚本的一部分进行排序。

例如,给定当前状态aggregate.csv

1,olddata
3,olddata
2,olddata
Run Code Online (Sandbox Code Playgroud)

和文件new.csv

4,newdata
2,changeddata
3,changeddata
Run Code Online (Sandbox Code Playgroud)

我想aggregate.csv出来如下(以任何排序顺序):

1,olddata
2,changeddata
3,changeddata
4,newdata
Run Code Online (Sandbox Code Playgroud)

这些行可能包含大量列,因此一次替换一个单元格并不理想。CSV 保证不包含引用的换行符,因此逐行搜索并一次替换整行是一种有效的方法。

抱歉,如果这是重复的,但我找不到另一个完全使用这种 CSV 合并方法的问题。

我已经尝试调整这个问题的答案,但它首先需要通过逐行解析两个文件、排序、删除重复项和保存来生成所有 ID 的“模板文件”——我希望有一种更简单的方法是可能的。

这个问题在 sed 和 awk 中有答案,我也复制了这些答案,并管理了正则表达式替换部分,但不是在不存在匹配的情况下向文件追加新行的方法。

谢谢!

Ed *_*ton 5

使用任何 awk:

$ awk -F, '!seen[$1]++' new agg
4,newdata
2,changeddata
3,changeddata
1,olddata
Run Code Online (Sandbox Code Playgroud)

或使用 GNU 排序-s

$ sort -ust, -k1,1 new agg
1,olddata
2,changeddata
3,changeddata
4,newdata
Run Code Online (Sandbox Code Playgroud)

  • 你了解他们两个吗?如果没有,请随时提问。如果是这样,那么您将在代码中使用哪一个?一般来说,您不应该仅仅接受得到的第一个答案,因为从给定样本输入集产生预期输出的答案是识别最佳(甚至正确)解决方案的起点,而不是终点,并接受任何答案都会阻止其他人发布替代答案,所以这是你的损失。通常最好等待几个小时或一天,看看得到什么答案,然后接受答案。 (2认同)
  • 好吧,所以单独'!seen[$1]++'就足以说明“如果数组中尚不存在字段1,则将其添加到数组中并继续处理,但如果存在,则停止处理这个线”,没有任何关于“看到”的特殊内容。明白了,谢谢! (2认同)