我有一些数字,例如
7、15、6、2、-9
我希望在Bash中(从命令行或脚本文件)按以下方式对其进行排序:
-9、2、6、7、15
怎么做呢?使用sort命令无法得到所需的结果。
echo "7, 15, 6, 2, -9" | sed -e $'s/,/\\\n/g' | sort -n | tr '\n' ',' | sed 's/.$//'
sed -e $'s/,/\\\n/g'
: 用于通过逗号将字符串分割为行。sort -n
: 然后你可以使用按数字排序的 sort 命令。tr '\n' ','
: 将换行符转换回逗号。sed 's/.$//'
: 删除尾随逗号。不够优雅,但应该可行 :p
tr
命令将逗号(和空格)替换为换行符感到好奇:echo "7, 15, 6, 2, -9" | tr -s ', ' '\n\n' | sort -n | tr '\n' ',' | sed 's/,$//'
。在评论中提到的使用paste -sd ','
的替代方案,比第二个tr
和sed
更加实用。此外,POSIX要求paste
必须指定文件名,所以可移植的代码应该使用paste -s -d ',' -
——GNU paste
的做法更为合理,但是BSD(macOS)的paste
严格遵循POSIX标准。 - Jonathan Leffler$ 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 ", "
告诉如何在传递给打印函数之前连接数组元素总结回答和评论,以下代码可以按顺序排列数字并保留空格:
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
指令并进行管道传递。
tr ',' '\n' <<< "7,15,6,2,-9" | sort -n | paste -sd ','
- PesaThe| sed 's/,/, /g'
即可。输入中的空格也可以使用tr
命令去除。paste
的关键作用是不会在最后一个数字后附加逗号。 - Jonathan Leffler