我有一个csv
包含不同收入的文件。我想按收入从高到低对 csv 文件进行排序。我无法找到如何在不使用 python 的情况下在终端中执行此操作。
我不想使用Python。
我想使用简单的东西,比如mlr
// 。sed
awk
输入:
name,location,capital,profit-lost,revenue,employees,year
company1,location1,35527.19,-33226.25,,0.70,2020
company2,location2,-155921.70,-146.03,,,2020
company3,location3,1873134.74,778424.56,13320152.32,16.90,2020
company4,location4,1050987.60,426317.61,,24.90,2021
company5,location5,368506.18,11997.04,,,2019
company6,location6,7965648.89,369947.14,64413602.44,103.30,2019
company7,location7,1531534.27,125750.94,3054307.36,12.10,2020
company8,location8,6161574.62,906591.96,124804038.64,51.30,2021
输出:
name,location,capital,profit-lost,revenue,employees,year
company8,location8,6161574.62,906591.96,124804038.64,51.30,2021
company6,location6,7965648.89,369947.14,64413602.44,103.30,2019
company3,location3,1873134.74,778424.56,13320152.32,16.90,2020
company7,location7,1531534.27,125750.94,3054307.36,12.10,2020
company1,location1,35527.19,-33226.25,,0.70,2020
company2,location2,-155921.70,-146.03,,,2020
company4,location4,1050987.60,426317.61,,24.90,2021
company5,location5,368506.18,11997.04,,,2019
收入空到几十亿。
希望有人也能帮助我解决这个问题
使用
sort
:需要
sed -u 1q
忽略sort
标头。它基本上意味着,处理第一行并退出,然后将剩余的传递给sort
.-u
是 的缩写--unbuffered
,以避免处理超过第一行。排序的标志:
-t,
将分隔符指定为逗号。-r
使排序后的输出降序排列。默认情况下是升序的。-n
按数字排序。-k5
对第五个键/列进行排序。演示:
因此,您希望按数字降序对收入进行(稳定)排序,这听起来在 Miller 中应该很容易,除了它的空处理规则说:
这意味着它们首先按降序排序:
然而,使用then 链接,可以直接使用将数字 0 分配给空收入的键进行装饰-排序-取消装饰:
使用所有 Unix 系统上可用的强制 POSIX 工具:
请参阅下面的评论和head 可以读取比输出更多的输入行吗?有关上述脚本的其他重要信息。
duckdb db cli确实是一个很棒的工具,而且它只是 SQL
你得到
MacOS 默认使用 Ruby,Ruby 内置了一个 csv 解析器。
这是红宝石:
或者您可以这样使用 GNU awk(不是 MacOS 本机 awk):
或者常规的 MacOS awk 并创建一个管道
sort
(这是这三个中最快的):任何这些印刷品:
使用Raku(以前称为 Perl_6)
简而言之,第一行
line
(标题行)被读取并立即输出put
。然后读取其余行。在第一个示例中,值行存储在@a
数组中。在第二个示例中,行直接排序。该sort
函数采用映射器,这里对split
逗号所在的行进行排序,然后采用第五列(零索引 = 4)。由于排序通常按升序排列,因此-*.
使用负号来反转排序顺序。输入示例:
示例输出:
对于更复杂的 CSV 文件:
https://docs.raku.org/routine/lines
https://docs.raku.org/routine/split
https://github.com/Tux/CSV
https://raku.org