使用多部分项目对列表进行排序

时间:2013-05-29 11:40:48

标签: bash list sorting

第三,尝试了解我做错了什么。

我有一个这样的清单:

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

2 个答案:

答案 0 :(得分: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

显然,这会使您输入的任何内容变得混乱。修复回车。

答案 1 :(得分:0)

您的语言环境的设置方式是.被解释为千位分隔符而不是小数点,并且数值会相应地排序(1111.1被解释为11111,例如{{1} }})。使用

LC_ALL=de_DE

在执行export LC_ALL=C 之前(当然,使用正确的引用,如glenn和fedorqui的答案)。