シェル
高レベルの言語をロードするには時間がかかります。
数行では、シェル自体が解決策になる場合があります。
外部コマンドを使用できますsort
、そしてコマンドのtr
。1つは行のソートに非常に効率的で、もう1つは1つの区切り文字を改行に変換するのに効果的です。
#!/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秒かかります。本当に、シェルはファイルを処理するのに最適なツールではありません。
Awk
数行以上(数十以上)の場合、実際のプログラミング言語を使用することをお勧めします。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"
forファイル<<<"$2"
をシェル変数内のfor行に戻すことができることを理解してください。
Perl
最速のソリューションは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"
を単純にソートし、perlオプションに"$a"
追加-i
してファイルの編集を「適切な場所」にする場合:
#!/bin/bash
perlsort(){ perl -lpi -e '$_=join("'"$1"'",sort {$a <=> $b} split(/['"$1"']/))' "$2"; }
perlsort '.' infile; exit