关于同线洗涤的排序

0g0grzrc  于 2022-10-17  发布在  Unix
关注(0)|答案(7)|浏览(187)

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

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

但是,当我将-n添加到回显时,sort命令停止工作。我试图在不使用printf的情况下做到这一点。使用echo -n,它们不会排序,而只是按输入的顺序打印。

gdx19jrr

gdx19jrr1#

您可以这样做:

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

printf "%s\n" ${b[@]}

# b is reverse sorted nuemrically now
goucqfw6

goucqfw62#

man sort会告诉你:

sort - sort lines of text files

因此,您可以在排序之后将结果转换为所需的格式。
为了达到预期的效果,你可以说:

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

mspsb9vt3#

也许这是因为排序是“面向行的”,所以您需要将每个数字放在单独的行上,而不是将-n与ECHO一起使用。您只需使用sed将排序后的数字放回一行中,如下所示:

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

axkjgtzd4#

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

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

如果您只想要一行的结果,您可以这样做:

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

1bqhqjot5#

其中一个诀窍就是玩iFS:

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

这与Join()函数的概念相同,但更易于阅读:

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

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

20jt8wwn6#

在逗号或空格分隔的单行中对数字进行排序,请使用下面的

echo "12,12,3,55,567,23,6,9,35,423"|sed -e 's;[ |,];\n;g'|sort -n|xargs|sed -e 's; ;,;g'

如果您的输出不需要逗号,请在xargs之后跳过sed

4urapxun

4urapxun7#

不需要环路:


# !/bin/bash

sorted=( $(sort -rn < <(printf '%s\n' $@)) )
echo ${sorted[@]}

相关问题