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

8

我有一些数字,例如

7、15、6、2、-9

我希望在Bash中(从命令行或脚本文件)按以下方式对其进行排序:

-9、2、6、7、15

怎么做呢?使用sort命令无法得到所需的结果。


4
在逗号后面需要加空格吗?没有空格的话,代码就是这样的:tr ',' '\n' <<< "7,15,6,2,-9" | sort -n | paste -sd ',' - PesaThe
1
@PesaThe:如果需要逗号和空格,只需在命令行后加上 | sed 's/,/, /g' 即可。输入中的空格也可以使用 tr 命令去除。paste 的关键作用是不会在最后一个数字后附加逗号。 - Jonathan Leffler
3个回答

15
echo "7, 15, 6, 2, -9" | sed -e $'s/,/\\\n/g' | sort -n | tr '\n' ',' | sed 's/.$//'
  1. sed -e $'s/,/\\\n/g': 用于通过逗号将字符串分割为行。
  2. sort -n: 然后你可以使用按数字排序的 sort 命令。
  3. tr '\n' ',': 将换行符转换回逗号。
  4. sed 's/.$//': 删除尾随逗号。

不够优雅,但应该可行 :p


3
好的!我对于你没有使用tr命令将逗号(和空格)替换为换行符感到好奇:echo "7, 15, 6, 2, -9" | tr -s ', ' '\n\n' | sort -n | tr '\n' ',' | sed 's/,$//'。在评论中提到的使用paste -sd ','的替代方案,比第二个trsed更加实用。此外,POSIX要求paste必须指定文件名,所以可移植的代码应该使用paste -s -d ',' -——GNU paste的做法更为合理,但是BSD(macOS)的paste严格遵循POSIX标准。 - Jonathan Leffler

1
使用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*' 使用,和可选的空格/制表符作为字段分隔符
  • sort {$a <=> $b} @F 按升序对数组进行数字排序...使用sort {$b <=> $a} @F'进行降序排序
  • join ", " 告诉如何在传递给打印函数之前连接数组元素

0

总结回答和评论,以下代码可以按顺序排列数字并保留空格:

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指令并进行管道传递。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接