在同一行Bash上排序

时间:2013-10-09 14:21:42

标签: bash sorting unix

您好我正在尝试对一组数字命令行参数进行排序,然后在相同的行上以反向数字顺序将它们回显,每行之间有一个空格。我有这个循环:

for var in "$@"
do
echo -n "$var "
done | sort -rn

但是当我将-n添加到echo时,sort命令停止工作。我试图在不使用printf的情况下执行此操作。使用echo -n,他们不会按照输入的顺序进行排序和打印。

5 个答案:

答案 0 :(得分:3)

你可以这样做:

a=( $@ )
b=( $(printf "%s\n" ${a[@]} | sort -rn) )

printf "%s\n" ${b[@]}
# b is reverse sorted nuemrically now

答案 1 :(得分:2)

sort用于对多行文本进行排序。使用-n选项echo,您可以将所有内容打印在一行中。 如果要对输出进行排序,则必须以多行打印:

for var in "$@"
do
    echo  $var
done | sort -rn

如果您只想在一行上获得结果:

echo $(for var in "$@"; do echo $var; done | sort -rn)

答案 2 :(得分:1)

man sort会告诉你:

   sort - sort lines of text files

因此,您可以在排序后将结果转换为所需的格式

为了达到理想的效果,您可以说:

for var in "$@"
do
  echo "$var"
done | sort -rn | paste -sd' '

答案 3 :(得分:1)

一个技巧是玩IFS:

IFS=$'\n'
set "$*"
IFS=$' \n'
set $(sort -rn <<< "$*")
echo $*

这是一个相同的想法,但更容易用join()函数阅读:

join() {
    IFS=$1
    shift
    echo "$*"
}

join ' ' $(join $'\n' $* | sort -nr)

答案 4 :(得分:1)

也许这是因为sort是“面向行的”,所以你需要在一个单独的行上使用每个数字,而不是使用带回声的-n的情况。 您可以使用sed简单地将已排序的数字放回一行,如下所示:

for var in "$@";
do
    echo "$var ";
done | sort -rn | sed -e ':a;N;s/\n/ /;ba'