如何将 csv 文件中的多行汇总为 1 行?我已经尝试在 SQL 中进行查询并且它可以工作,但我不确定如何在 Linux 中实现相同的效果。
这是我当前文件的外观:
swainb02,Ben Swain,1015
swainb02,Ben Swain,1016
swainb02,Ben Swain,1018
swainb02,Ben Swain,1020
shaiks21,Sarah Shaikh,0073
shaiks21,Sarah Shaikh,0080
shaiks21,Sarah Shaikh,0082
有多个用户可以访问多个区号。我正在寻找的是该文件的更简单版本,以提高可读性。
期望的输出:
swainb02,Ben Swain,1015,1016,1018,1020
shaiks21,Sarah Shaikh,0073,0080,0082
知道如何解决吗?谢谢
在结果上运行一个小
awk
脚本:它打印一次新用户的数据,然后附加区号,直到遇到下一个用户。
假设输入是没有嵌入逗号、换行符或引号的简单 CSV,我们可以使用 GNU
datamash
按前两个逗号分隔的字段分组并折叠第三个字段:这假定数据在前两个字段上排序(或者将一起排序的记录在文件中彼此相邻,如示例数据中所示)。如果不是,则
sort -t, -k 1,2
首先传递数据,或使用datamash
其-s
(or--sort
) 选项。假设您的输入按问题中所示的键值分组(如果不只是先对输入进行排序)然后在每个 Unix 机器上的任何 shell 中使用任何 awk 并且无论您的输入文件有多大,都几乎不使用内存:
伟大的。然后在
sqlite :memory:
没有文件支持数据库的情况下运行工作(假设没有数十亿行,这应该没问题)。在那里,运行(或只是将此程序通过管道传输到解释器中)完毕。该
sqlite3
客户端几乎在任何地方都可用,我将其称为最类似于 UNIX 的方法,它使用结构化查询语言解释器来执行这样的结构化查询。总而言之,你可以在你的 shell 中输入这个(bash/dash/zsh 和类似的):之后,您可以运行
runmyquery myfile.csv
并获得结果。sqlite3
也可以交互使用。无论行的顺序如何,这个 awk 版本都可以工作:
另一方面,csvkit 输出更正确的结果:
尽管没有引号看起来更好,但另一个示例很容易导致每行的字段数量不同。对于进一步处理,非常需要具有分隔的第三字段的输出。