使用 bash 或 shell 对 csv 文件进行 SQL 操作

Adi*_*tya -1 bash shell-script text-processing sql

这是我的输入文件

0164318,001449,001452,001922  
0164318,001456,001457,001922  
0842179,002115,002118,001485  
0846354,001512,001513,001590  
0841422,001221,001224,001860  
0841422,001227,001228,001860
Run Code Online (Sandbox Code Playgroud)

我想要我的结果

0164318,001449,001457,001922  
0842179,002115,002118,001485  
0846354,001512,001513,001590  
0841422,001221,001228,001860 
Run Code Online (Sandbox Code Playgroud)

使用 col1 分组并
通过 shell 脚本查找 min(col2) 和 max(col3) 。

pLu*_*umo 6

使用csvkit

csvsql -H --query "select a,min(b),max(c),d from file group by a,d" file.csv
Run Code Online (Sandbox Code Playgroud)

请注意,这将截断前导 0。

输出:

a,min(b),max(c),d
164318,1449,1457,1922
841422,1221,1228,1860
842179,2115,2118,1485
846354,1512,1513,1590
Run Code Online (Sandbox Code Playgroud)


Kus*_*nda 6

使用csvkit,

$ csvsql -H --query 'SELECT a,min(b),max(c),d FROM file GROUP BY a' file.csv
a,min(b),max(c),d
164318,1449,1457,1922
841422,1221,1228,1860
842179,2115,2118,1485
846354,1512,1513,1590
Run Code Online (Sandbox Code Playgroud)

这会将 CSV 数据加载到临时数据库中(我相信默认为 SQLite),然后将给定的 SQL 查询应用于它。默认情况下,该表将与输入文件具有相同的名称(无后缀),并且由于数据缺少列标题,因此默认字段名称将按字母顺序排列。

-H选项告诉csvsql该数据没有列标题。

要删除输出中生成的标头,请通过类似于sed '1d'.

要获得零填充整数:

$ csvsql -H --query 'SELECT printf("%07d,%06d,%06d,%06d",a,min(b),max(c),d) FROM file GROUP BY a' file.csv
"printf(""%07d,%06d,%06d,%06d"",a,min(b),max(c),d)"
"0164318,001449,001457,001922"
"0841422,001221,001228,001860"
"0842179,002115,002118,001485"
"0846354,001512,001513,001590"
Run Code Online (Sandbox Code Playgroud)

在这里,这些行被引用,因为我们实际上只为每个结果记录请求一个输出字段(并且它包含逗号)。另一种方法,它涉及更多的输入,但不会生成额外的双引号:

$ csvsql -H --query 'SELECT printf("%07d",a),printf("%06d",min(b)),printf("%06d",max(c)),printf("%06d",d) FROM file GROUP BY a' file.csv
"printf(""%07d"",a)","printf(""%06d"",min(b))","printf(""%06d"",max(c))","printf(""%06d"",d)"
0164318,001449,001457,001922
0841422,001221,001228,001860
0842179,002115,002118,001485
0846354,001512,001513,001590
Run Code Online (Sandbox Code Playgroud)

同样,可以通过将结果通过sed '1d'.