0

3番目に、私が間違っていることを理解しようとします。

次のようなリストがあります。

array[0] = 1111 Here is much text
array[1] = 2222 Here is even more text
array[2] = 1111.1 Here is special text

次に、リストを次のように並べ替えます。

1111 Here is much text
1111.1 Here is special text
2222 Here is even more text

使用する

for j in ${array[@]}; do echo $j; done | sort -n

スペースがあるため、すべての部分が分離されています。

使用する

for j in "${array[@]}"; do echo "$j"; done | sort -n

1111 2222 1111.1 のようなソートされたリストを取得します

4

2 に答える 2

3
array=(
    "1111 Here is much text" 
    "2222 Here is even more text" 
    "1111.1 Here is special text"
)
printf "%s\n" "${array[@]}" | sort -n
1111 Here is much text
1111.1 Here is special text
2222 Here is even more text

保存するには:

sorted=()
while IFS= read -r line; do
    sorted+=("$line")
done  < <( printf "%s\n" "${array[@]}" | sort -n )
printf "%s\n" "${sorted[@]}"
# same output as above

また

source <( echo 'sorted=('; printf '"%s"\n' "${array[@]}" | sort -n; echo ')' )
printf "%s\n" "${sorted[@]}"

ファイル内の改行は混乱を招きます。dos スタイルの行末を持つ「t」という名前のファイルを考えてみましょう。

$ cat -e t
line1^M$
line2^M$
line3^M$
$ for n in {1..3} ; do array[n]="$(echo $n $(cat t))"; done
$ printf "%s\n" "${array[@]}"|od -c
0000000   1       l   i   n   e   1  \r       l   i   n   e   2  \r    
0000020   l   i   n   e   3  \r  \n   2       l   i   n   e   1  \r    
0000040   l   i   n   e   2  \r       l   i   n   e   3  \r  \n   3    
0000060   l   i   n   e   1  \r       l   i   n   e   2  \r       l   i
0000100   n   e   3  \r  \n
0000105
$ printf "%s\n" "${array[@]}"
 line31
 line31
 line31

明らかに、これにより、この入力でフィードするものはすべて台無しになります。改行を修正します。

于 2013-05-29T12:22:33.790 に答える
0

.お使いのロケールは、 が小数点ではなく千単位の区切り記号として解釈されるように設定されており、数値はそれに応じて並べ替えられます (1111.1 は 11111 として解釈されます。たとえば、 LC_ALL=de_DE)。使用する

export LC_ALL=C

実行する前にsort(もちろん、グレンとフェドルキの回答のように、適切な引用を使用してください)。

于 2013-05-29T13:58:32.970 に答える