如何在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 ','
替代方案是有用的,而不是第二个tr
和sed
。并且 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 <=> $b @F
对数组进行数字排序,按升序排列...使用sort $b <=> $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中对逗号分隔的值进行排序?的主要内容,如果未能解决你的问题,请参考以下文章