[英]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.