Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在同一行Bash上排序_Bash_Sorting_Unix - Fatal编程技术网

在同一行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
设置为