【发布时间】:2015-03-16 02:55:01
【问题描述】:
抱歉,如果我打开一个新问题,但它与前一个问题无关,因为现在我需要一个 bash 命令来分析输出。
我有一个查询的输出存储在这样的文件中:
3277654321 333011123456789
3277654321 333015123456789
3277654321 333103123456789
3277654321 333201123456789
3291234567 333991123456789
3291234567 333991123456789
3291234567 333011123456789
我需要一个 bash 命令来计算具有相同前 5 位数字的 field1 和 field2 并报告如下输出:
3277654321=4;33301=2;33310=1;33320=1
3291234567=3;33399=2;33301=1
谢谢 卢卡斯。
【问题讨论】:
-
这对
awk来说不会太具有挑战性,而且毫无疑问,最终会有人提供代码编写服务,尽管 SO 并不是“请为我编写代码”服务。但在我看来,直接从数据库生成您想要的报告会更好,使用实际生成最终结果的查询而不是中间列表。 -
如果你是从数据库中查询,直接做可能会更容易。
-
直接从数据库生成这样的报告是各种混乱。只要对数据进行了排序(数据库可以做到),那么后处理就不是不合理的。并且数据库可以而且应该为您做更多的工作:它可以合理地生成第一个字段、第二个字段的前 5 个字符以及条目数:
SELECT field1, SUBSTR(field2, 1, 5) AS field2, COUNT(*) AS number FROM TheTable GROUP BY field1, field2 ORDER BY field1, field2。这样,通过网络传输的数据就会减少,如果数据库是远程的,这会很有帮助。 -
@JonathanLeffler:以下似乎在 sqlite3 中运行良好;对于 mysql,您需要将逗号更改为 group_concat 中的 SEPARATOR 一词:
select field1||"="||SUM(count2)||";"||group_concat(field2||"="||count2,";") as fields FROM (select field1, SUBSTR(field2,1,5) AS field2, COUNT(*) as count2 from tmp GROUP BY field1, field2 ORDER BY field1, field2) GROUP BY field1 ORDER BY field1;。这不是那凌乱,恕我直言。 -
@rici:是的,正如您所展示的,使用非标准的
GROUP_CONCAT聚合(并且 ORDER BY 在子查询中可用,也是非标准的),还不错。 (非标准,如“不属于 ISO 标准 SQL”,AFAIK。)
标签: bash