贝壳
加载高级语言需要时间。
对于几行代码,外壳本身可能是一个解决方案。
我们可以使用外部命令sort
和命令tr
。一种有效地对行进行排序,另一种有效地将一个定界符转换为换行符:
#!/bin/bash
shsort(){
while IFS='' read -r line; do
echo "$line" | tr "$1" '\n' |
sort -n | paste -sd "$1" -
done <<<"$2"
}
shsort ' ' '10 50 23 42'
shsort '.' '10.1.200.42'
shsort ',' '1,100,330,42'
shsort '|' '400|500|404'
shsort ',' '3 b,2 x,45 f,*,8jk'
shsort '.' '10.128.33.6
128.17.71.3
44.32.63.1'
因为<<<
仅使用,所以需要bash 。如果将其替换为here-doc,则该解决方案对posix有效。
这是能够与制表符,空格或壳水珠字符字段进行排序(*
,?
,[
)。不是换行符,因为每一行都在排序。
更改<<<"$2"
为<"$2"
处理文件名并按如下方式调用它:
shsort '.' infile
整个文件的定界符相同。如果这是一个限制,则可以对其进行改进。
但是,只有6000行的文件需要15秒才能处理。确实,shell并不是处理文件的最佳工具。
Awk
对于多行(多于10行),最好使用一种真正的编程语言。一个awk解决方案可能是:
#!/bin/bash
awksort(){
gawk -v del="$1" '{
split($0, fields, del)
l=asort(fields)
for(i=1;i<=l;i++){
printf( "%s%s" , (i==0)?"":del , fields[i] )
}
printf "\n"
}' <"$2"
}
awksort '.' infile
对于上述相同的6000行文件,仅需0.2秒。
请理解,<"$2"
可以将<<<"$2"
shell变量内的for文件改回for行。
佩尔
最快的解决方案是perl。
#!/bin/bash
perlsort(){ perl -lp -e '$_=join("'"$1"'",sort {$a <=> $b} split(/['"$1"']/))' <<<"$2"; }
perlsort ' ' '10 50 23 42'
perlsort '.' '10.1.200.42'
perlsort ',' '1,100,330,42'
perlsort '|' '400|500|404'
perlsort ',' '3 b,2 x,45 f,*,8jk'
perlsort '.' '10.128.33.6
128.17.71.3
44.32.63.1'
如果要将文件更改排序<<<"$a"
为简单"$a"
并添加-i
到perl选项以使文件版本“就地”:
#!/bin/bash
perlsort(){ perl -lpi -e '$_=join("'"$1"'",sort {$a <=> $b} split(/['"$1"']/))' "$2"; }
perlsort '.' infile; exit