如何在bash中对逗号分隔的值进行排序?

Posted

技术标签:

【中文标题】如何在bash中对逗号分隔的值进行排序?【英文标题】:How to sort comma separated values in bash? 【发布时间】:2018-05-19 19:08:22 【问题描述】:

我有一些数字,比如

7, 15, 6, 2, -9

我想在 bash 中这样排序(从命令行或脚本文件)

-9, 2, 6, 7, 15

我该怎么做?我无法使用排序命令得到这个。

【问题讨论】:

逗号后是否需要空格?没有它们,它只是:tr ',' '\n' <<< "7,15,6,2,-9" | sort -n | paste -sd ',' @PesaThe:如果需要逗号空格,则只需在命令行后面加上| sed 's/,/, /g'。输入中的空格也可以是tr'd。 paste 的关键工作是在最后一个数字后不附加逗号。 【参考方案1】:
echo "7, 15, 6, 2, -9" | sed -e $'s/,/\\\n/g' | sort -n | tr '\n' ',' | sed 's/.$//'
    sed -e $'s/,/\\\n/g': 用逗号将字符串分割成行。 sort -n: 那你就可以用数字排序了 tr '\n' ',': 隐藏换行分隔符回到逗号。 sed 's/.$//':去掉尾逗号。

不够优雅,但它应该可以工作:p

【讨论】:

不错!我很好奇您没有使用tr 用换行符替换逗号(和空格):echo "7, 15, 6, 2, -9" | tr -s ', ' '\n\n' | sort -n | tr '\n' ',' | sed 's/,$//'。在comment 中建议的paste -sd ',' 替代方案是有用的,而不是第二个trsed。并且 POSIX 需要 paste 的文件名,因此可移植代码将使用 paste -s -d ',' - — GNU paste 更明智,但 BSD (macOS) paste 在这方面完全遵循 POSIX。【参考方案2】:

perl

$ s='7, 15, 6, 2, -9'
$ echo "$s" | perl -F',\h*' -lane 'print join ", ", sort $a <=> $b @F'
-9, 2, 6, 7, 15
$ echo "$s" | perl -F',\h*' -lane 'print join ", ", sort $b <=> $a @F'
15, 7, 6, 2, -9
-F',\h*' 使用 , 和可选的空格/制表符作为字段分隔符 有关命令行选项的说明,请参阅 https://perldoc.perl.org/perlrun.html#Command-Switches sort $a &lt;=&gt; $b @F 对数组进行数字排序,按升序排列...使用sort $b &lt;=&gt; $a @F' 降序排列 join ", " 告诉如何在传递到打印之前加入数组元素

【讨论】:

【参考方案3】:

总结答案和 cmets,这可以工作并保持空格:

echo "7, 15, 6, 2, -9" | sed -e $'s:,:\\\n:g' | sort -n | paste -sd ',' - | sed 's:,:, :g'

请注意,您可以通过sed -e 's:,:\n:g' 而不是第一个sed 电话逃脱。这适用于运行bash 4.2.46 版和sed 4.2.2 版的系统。要删除空格(或者如果它们是不必要的),请删除最后的 sed 调用和管道。

【讨论】:

以上是关于如何在bash中对逗号分隔的值进行排序?的主要内容,如果未能解决你的问题,请参考以下文章

如何在bash中对语义版本进行排序?

如何在 BASH 中将制表符分隔值 (TSV) 文件转换为逗号分隔值 (CSV) 文件?

如何在 Laravel 中对数组的值进行排序

如何在Java中对HashMap进行排序[重复]

在变量 BASH 的一行中用逗号分隔值

如何在Javascript中用逗号分隔的值匹配数组?