껍질
더 높은 수준의 언어를로드하려면 시간이 걸립니다.
몇 줄은 쉘 자체가 해결책 일 수 있습니다.
외부 명령 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 초가 걸립니다. 실제로 쉘은 파일을 처리하는 데 가장 적합한 도구는 아닙니다.
어 wk
몇 줄 이상 (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"
for 파일은 <<<"$2"
쉘 변수 내부의 행 으로 다시 변경 될 수 있음을 이해 하십시오.
펄
가장 빠른 해결책은 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