簡體   English   中英

在同一行上排序 Bash

[英]Sorting on Same Line Bash

您好,我正在嘗試對一組數字命令行 arguments 進行排序,然后在同一行上以相反的數字順序回顯它們,每行之間有一個空格。 我有這個循環:

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

但是,當我將-n添加到 echo 時, sort命令停止工作。 我試圖在不使用printf的情況下執行此操作。 使用echo -n它們不會排序,只是按照輸入的順序打印。

您可以這樣做:

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

printf "%s\n" ${b[@]}
# b is reverse sorted nuemrically now

sort用於對多行文本進行排序。 使用echo -n選項,將所有內容打印在一行中。 如果要對輸出進行排序,則必須多行打印:

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

如果只需要一行結果,則可以執行以下操作:

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

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 $*

這是相同的想法,但使用join()函數更容易閱讀:

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

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

也許是因為sort是“面向行的”,所以您需要將每個數字放在單獨的行上,而將-n與echo一起使用則不是這種情況。 您可以簡單地使用sed將排序后的數字放回一行,如下所示:

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

以逗號或空格分隔的單行數字排序,使用以下

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

如果你的 output 不需要逗號,跳過 xargs 后面的 sed

不需要循環:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM