在同一行Bash上排序
您好,我正在尝试对一组数字命令行参数进行排序,然后在同一行上以相反的数字顺序回显它们,每行之间有一个空格。我有一个循环:在同一行Bash上排序,bash,sorting,unix,Bash,Sorting,Unix,您好,我正在尝试对一组数字命令行参数进行排序,然后在同一行上以相反的数字顺序回显它们,每行之间有一个空格。我有一个循环: for var in "$@" do echo -n "$var " done | sort -rn 但是,当我将-n添加到echo时,sort命令停止工作。我尝试在不使用printf的情况下执行此操作。使用echo-n,它们不排序,只按输入的顺序打印。排序用于对多行文本进行排序。使用echo的-n选项,您可以在一行中打印所有内容。 如果要对输出进行排序,必须将其打印成多行
for var in "$@"
do
echo -n "$var "
done | sort -rn
但是,当我将
-n
添加到echo时,sort
命令停止工作。我尝试在不使用printf
的情况下执行此操作。使用echo-n
,它们不排序,只按输入的顺序打印。排序
用于对多行文本进行排序。使用echo
的-n
选项,您可以在一行中打印所有内容。
如果要对输出进行排序,必须将其打印成多行:
for var in "$@"
do
echo $var
done | sort -rn
如果只想在一行上显示结果,可以执行以下操作:
echo $(for var in "$@"; do echo $var; done | sort -rn)
sort
用于对多行文本进行排序。使用echo
的-n
选项,您可以在一行中打印所有内容。
如果要对输出进行排序,必须将其打印成多行:
for var in "$@"
do
echo $var
done | sort -rn
如果只想在一行上显示结果,可以执行以下操作:
echo $(for var in "$@"; do echo $var; done | sort -rn)
您可以这样做:
a=( $@ )
b=( $(printf "%s\n" ${a[@]} | sort -rn) )
printf "%s\n" ${b[@]}
# b is reverse sorted nuemrically now
您可以这样做:
a=( $@ )
b=( $(printf "%s\n" ${a[@]} | sort -rn) )
printf "%s\n" ${b[@]}
# b is reverse sorted nuemrically now
man sort
会告诉您:
sort - sort lines of text files
因此,您可以在排序后将结果转换为所需的格式
为了达到预期的结果,您可以说:
for var in "$@"
do
echo "$var"
done | sort -rn | paste -sd' '
man sort
会告诉您:
sort - sort lines of text files
因此,您可以在排序后将结果转换为所需的格式
为了达到预期的结果,您可以说:
for var in "$@"
do
echo "$var"
done | sort -rn | paste -sd' '
其中一个技巧是使用IFS:
IFS=$'\n'
set "$*"
IFS=$' \n'
set $(sort -rn <<< "$*")
echo $*
其中一个技巧是使用IFS:
IFS=$'\n'
set "$*"
IFS=$' \n'
set $(sort -rn <<< "$*")
echo $*
也许这是因为排序是“面向行的”,所以您需要将每个数字放在单独的一行上,而使用-n和echo则不是这种情况。 您可以使用sed简单地将排序后的数字放回一行,如下所示:
for var in "$@";
do
echo "$var ";
done | sort -rn | sed -e ':a;N;s/\n/ /;ba'
也许这是因为排序是“面向行的”,所以您需要将每个数字放在单独的一行上,而使用-n和echo则不是这种情况。 您可以使用sed简单地将排序后的数字放回一行,如下所示:
for var in "$@";
do
echo "$var ";
done | sort -rn | sed -e ':a;N;s/\n/ /;ba'
出于什么原因您不想使用
printf
?当然,通常带有参数的echo
是不可移植的。为什么不使用printf
?好吧,通常带有参数的echo
是不可移植的。echo-n不显示\n
@Jite使用-e
选项来阻止-n
选项确实有点扭曲。建议用$(…)
来代替反勾。如果你只是写echo$(…)
,所有的东西都在一行上,最后换行。不需要echo-n$(…)
后跟echo
来输出换行符。您还可以使用printf“%s\n”“$@”| sort-rn
作为删除可见循环的命令(循环隐藏在printf
命令中)。@HunterMcMillen如我上面所述,带有选项的echo是不可移植的。关于bash,您似乎是对的,但是在我使用的zsh
中:echo-n不输出尾随的换行符。因此,添加echo-n“Bla\n”
将输出尾随的换行符。正是出于这个原因,我更喜欢printf
。echo-n不显示\n
@Jite使用-e
选项来阻止-n
选项确实有点扭曲。建议用$(…)
来代替反勾。如果你只是写echo$(…)
,所有的东西都在一行上,最后换行。不需要echo-n$(…)
后跟echo
来输出换行符。您还可以使用printf“%s\n”“$@”| sort-rn
作为删除可见循环的命令(循环隐藏在printf
命令中)。@HunterMcMillen如我上面所述,带有选项的echo是不可移植的。关于bash,您似乎是对的,但是在我使用的zsh
中:echo-n不输出尾随的换行符。因此,添加echo-n“Bla\n”
将输出尾随的换行符。正是因为这个原因,我更喜欢printf。是的,问题在于sort
是面向行的,echo-n
创建一行。虽然sed可以工作,但它是一个相当繁重的选项。欢迎使用堆栈溢出。是的,问题在于sort
是面向行的,echo-n
创建一行。虽然sed
可以工作,但它是一个相当繁重的选项。不过,我认为你应该多解释一下它为什么会起作用。您是有意将IFS设置为两个非标准设置,还是第二个设置旨在恢复默认设置?如果是前者,为什么不干脆IFS=$'
;如果是后者,则省略了tab,最好保存当前值并将其还原:save=“$IFS”;IFS=$'\n';设置“$*”;IFS=“$save”;set$(sort-rn@Jonathan,这两个IFS
设置是有意的。该技术使用IFS
和echo将位置参数与任意字符连接起来。当IFS
设置为$'\n'
和set“$*”时调用
,然后用新行分隔位置参数。我不想麻烦保存$IFS
,因为它只作用于子shell:bash-c'IFS=“xyz”&&printf“$IFS\n”;printf“$IFS\n”
这是可行的。不过,我认为您应该进一步解释一下它的工作原理。您是否有意将IFS设置为两个非标准设置,或者第二个设置是为了恢复默认值?如果是前者,为什么不只是IFS=$”
;如果是后者,您省略了制表符,最好将当前值保存为d还原它:save=“$IFS”;IFS=$'\n';set“$*”IFS=“$save”set$(sort-rn@Jonathan,两个IFS
设置是有意的。该技术使用IFS
和echo将位置参数与任意字符连接起来。当IFS
设置为