你好,我正在尝试对一组数字命令行参数进行排序,然后在同一行上以相反的数字顺序回显它们,每个参数之间有一个空格。我有这样一个循环:
for var in "$@" do echo -n "$var " done | sort -rn
但是,当我将-n添加到回显时,sort命令停止工作。我试图在不使用printf的情况下做到这一点。使用echo -n,它们不会排序,而只是按输入的顺序打印。
-n
sort
printf
echo -n
gdx19jrr1#
您可以这样做:
a=( $@ ) b=( $(printf "%s\n" ${a[@]} | sort -rn) ) printf "%s\n" ${b[@]} # b is reverse sorted nuemrically now
goucqfw62#
man sort会告诉你:
man sort
sort - sort lines of text files
因此,您可以在排序之后将结果转换为所需的格式。为了达到预期的效果,你可以说:
for var in "$@" do echo "$var" done | sort -rn | paste -sd' '
mspsb9vt3#
也许这是因为排序是“面向行的”,所以您需要将每个数字放在单独的行上,而不是将-n与ECHO一起使用。您只需使用sed将排序后的数字放回一行中,如下所示:
for var in "$@"; do echo "$var "; done | sort -rn | sed -e ':a;N;s/\n/ /;ba'
axkjgtzd4#
sort用于对多行文本进行排序。使用echo的选项-n,您可以在一行中打印所有内容。如果要对输出进行排序,则必须将其打印为多行:
echo
for var in "$@" do echo $var done | sort -rn
如果您只想要一行的结果,您可以这样做:
echo $(for var in "$@"; do echo $var; done | sort -rn)
1bqhqjot5#
其中一个诀窍就是玩iFS:
IFS=$'\n' set "$*" IFS=$' \n' set $(sort -rn <<< "$*") echo $*
这与Join()函数的概念相同,但更易于阅读:
join() { IFS=$1 shift echo "$*" } join ' ' $(join $'\n' $* | sort -nr)
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
4urapxun7#
不需要环路:
# !/bin/bash sorted=( $(sort -rn < <(printf '%s\n' $@)) ) echo ${sorted[@]}
7条答案
按热度按时间gdx19jrr1#
您可以这样做:
goucqfw62#
man sort
会告诉你:因此,您可以在排序之后将结果转换为所需的格式。
为了达到预期的效果,你可以说:
mspsb9vt3#
也许这是因为排序是“面向行的”,所以您需要将每个数字放在单独的行上,而不是将-n与ECHO一起使用。您只需使用sed将排序后的数字放回一行中,如下所示:
axkjgtzd4#
sort
用于对多行文本进行排序。使用echo
的选项-n
,您可以在一行中打印所有内容。如果要对输出进行排序,则必须将其打印为多行:如果您只想要一行的结果,您可以这样做:
1bqhqjot5#
其中一个诀窍就是玩iFS:
这与Join()函数的概念相同,但更易于阅读:
20jt8wwn6#
在逗号或空格分隔的单行中对数字进行排序,请使用下面的
如果您的输出不需要逗号,请在xargs之后跳过sed
4urapxun7#
不需要环路: