2

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

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

但是,当我将其添加-n到 echo时,sort命令停止工作。我正在尝试不使用printf. 使用echo -n它们不会排序,只是按输入的顺序打印。

4

5 回答 5

3

你可以这样做:

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

printf "%s\n" ${b[@]}
# b is reverse sorted nuemrically now
于 2013-10-09T14:25:47.143 回答
1

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

for var in "$@";
do
    echo "$var ";
done | sort -rn | sed -e ':a;N;s/\n/ /;ba'
于 2013-10-09T14:44:28.740 回答
1

man sort会告诉你:

   sort - sort lines of text files

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

为了达到预期的效果,你可以说:

for var in "$@"
do
  echo "$var"
done | sort -rn | paste -sd' '
于 2013-10-09T14:31:49.063 回答
1

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

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

如果您只想在一行上得到结果,您可以这样做:

echo $(for var in "$@"; do echo $var; done | sort -rn)
于 2013-10-09T14:25:35.223 回答
1

一个技巧是玩 IFS:

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

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

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

join ' ' $(join $'\n' $* | sort -nr)
于 2013-10-09T14:43:23.530 回答