เปลือก
การโหลดภาษาระดับสูงกว่าต้องใช้เวลา
สำหรับสองสามบรรทัดเชลล์เองอาจเป็นโซลูชัน
เราสามารถใช้คำสั่งภายนอกและของคำสั่ง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'
ต้องทุบตีเพราะการใช้<<<
เท่านั้น หากถูกแทนที่ด้วย here-doc โซลูชันจะใช้ได้สำหรับ posix
นี้สามารถที่จะจัดเรียงเขตข้อมูลที่มีแท็บช่องว่างหรืออักขระเปลือก glob ( *
, ?
, [
) ไม่ขึ้นบรรทัดใหม่เนื่องจากแต่ละบรรทัดกำลังเรียงลำดับ
เปลี่ยน<<<"$2"
เป็น<"$2"
ประมวลผลชื่อไฟล์และเรียกว่า:
shsort '.' infile
ตัวคั่นจะเหมือนกันสำหรับไฟล์ทั้งหมด หากนั่นเป็นข้อ จำกัด ก็สามารถปรับปรุงได้
อย่างไรก็ตามไฟล์ที่มีเพียง 6,000 บรรทัดจะใช้เวลาประมวลผล 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
ซึ่งใช้เวลาเพียง 0.2 วินาทีสำหรับไฟล์ 6,000 บรรทัดเดียวกันที่กล่าวถึงข้างต้น
เข้าใจว่า<"$2"
สามารถเปลี่ยนไฟล์<<<"$2"
for เป็นบรรทัดภายในตัวแปร shell ได้
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"
เป็นอย่างง่าย"$a"
และเพิ่ม-i
ไปยังตัวเลือก perl เพื่อสร้างรุ่นไฟล์ "แทนที่":
#!/bin/bash
perlsort(){ perl -lpi -e '$_=join("'"$1"'",sort {$a <=> $b} split(/['"$1"']/))' "$2"; }
perlsort '.' infile; exit