Kulit
Memuat bahasa tingkat yang lebih tinggi membutuhkan waktu.
Untuk beberapa baris, shell itu sendiri bisa menjadi solusi.
Kita dapat menggunakan perintah eksternal sort
, dan dari perintah tr
. Satu cukup efisien dalam menyortir garis dan yang lainnya efektif untuk mengubah satu pembatas menjadi baris baru:
#!/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'
Ini perlu bash karena penggunaannya <<<
saja. Jika itu diganti dengan di sini-doc, solusinya berlaku untuk posix.
Hal ini dapat mengurutkan bidang dengan tab, spasi atau karakter shell gumpal ( *
, ?
, [
). Bukan baris baru karena setiap baris sedang diurutkan.
Ubah <<<"$2"
untuk <"$2"
memproses nama file dan menyebutnya seperti:
shsort '.' infile
Pembatas adalah sama untuk seluruh file. Jika itu adalah batasan, itu bisa diperbaiki.
Namun file dengan hanya 6000 baris membutuhkan waktu 15 detik untuk diproses. Sungguh, shell bukanlah alat terbaik untuk memproses file.
Awk
Untuk lebih dari beberapa baris (lebih dari beberapa 10-an) lebih baik menggunakan bahasa pemrograman nyata. Solusi awk bisa berupa:
#!/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
Yang hanya membutuhkan 0,2 detik untuk file 6000 baris yang sama yang disebutkan di atas.
Memahami bahwa <"$2"
file untuk dapat diubah kembali ke <<<"$2"
untuk baris di dalam variabel shell.
Perl
Solusi tercepat adalah 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'
Jika Anda ingin mengurutkan perubahan file secara <<<"$a"
sederhana "$a"
dan menambahkan -i
ke opsi perl untuk membuat edisi file "di tempat":
#!/bin/bash
perlsort(){ perl -lpi -e '$_=join("'"$1"'",sort {$a <=> $b} split(/['"$1"']/))' "$2"; }
perlsort '.' infile; exit