【发布时间】:2021-05-05 00:29:11
【问题描述】:
我想使用命令行工具(例如bash、sed、awk 等)将数据从一个 CSV 文件聚合到另一个文件中。每个文件中的每一行都以第 1 列中的唯一 ID 开头,如果目标中的一行与此 ID 匹配,则应替换该行,否则应附加该行。输入数据未排序,但结果的排序顺序无关紧要,因此如果有帮助,可以将文件作为脚本的一部分进行排序。
例如,给定aggregate.csv的当前状态:
1,olddata
3,olddata
2,olddata
还有文件new.csv:
4,newdata
2,changeddata
3,changeddata
我希望aggregate.csv 出现如下(按任何排序顺序):
1,olddata
2,changeddata
3,changeddata
4,newdata
这些行可能包含大量列,因此一次替换一个单元格并不理想。 CSV 保证不包含带引号的换行符,因此逐行搜索和一次替换整行是一种有效的方法。
抱歉,如果这是重复的,但我找不到另一个完全使用这种 CSV 合并方法的问题。
我已尝试将答案调整为this question,但它需要首先通过逐行解析两个文件、排序、删除重复项和保存来生成所有 ID 的“模板文件” - 我希望有一个更简单的方法是可能的。
This question 在 sed 和 awk 中有答案,我也复制了这些答案,并管理了 regex-replacement 部分,但不是在不存在匹配项时向文件追加新行的方法。
谢谢!
【问题讨论】:
-
需要了解正在处理的数据量,以确定(简单的)内存解决方案是否可行,或者我们是否需要查看(更)复杂的解决方案以解决潜在的内存不足问题- 记忆问题;每个文件有多少行?对这些线的最大宽度有一个大概的数字吗?回复:带有 'a large number of columns' 的行 ...您是要替换整行还是仅替换某些单元格?源文件和目标文件是否具有相同数量的单元格/字段?
-
@markp-fuso 粗略地说,我正在测试的文件有大约 30000 行,每个包含 20 个字段和大约 300 个字符。 (我想这可能不是每个人都会考虑的“大量列”,但我想避免必须在 20 个字段上执行 20 次任务的解决方案。)我正在寻找替换整行。源文件和目标文件的列数相同,但行数不同。
-
所以最大文件大小约为 9MB(给或取几 MB)?替换全部或部分行?
-
这是一个愿望,而不是关于你已经做过的任何事情的问题。
-
用你的一些(编码)尝试来更新问题并没有什么坏处;然后我们可以就(代码)更正提出建议
标签: bash join awk sed command-line