bash에서 문자열을 숫자로 정렬하는 방법은 무엇입니까? 파일들이 있다면 cwcch10.pdf cwcch11.pdf cwcch12.pdf cwcch13.pdf cwcch14.pdf cwcch15.pdf cwcch16.pdf cwcch17.pdf cwcch18.pdf cwcch1.pdf cwcch2.pdf cwcch3.pdf cwcch4.pdf cwcch5.pdf cwcch6.pdf cwcch7.pdf cwcch8.pdf cwcch9.pdf 문자열의 숫자 부분을 기준으로

디렉토리에이 파일들이 있다면

cwcch10.pdf
cwcch11.pdf
cwcch12.pdf
cwcch13.pdf
cwcch14.pdf
cwcch15.pdf
cwcch16.pdf
cwcch17.pdf
cwcch18.pdf
cwcch1.pdf
cwcch2.pdf
cwcch3.pdf
cwcch4.pdf
cwcch5.pdf
cwcch6.pdf
cwcch7.pdf
cwcch8.pdf
cwcch9.pdf

문자열의 숫자 부분을 기준으로 오름차순으로 표시되도록 Bash에 어떻게 나열 할 수 있습니까? 따라서 결과 순서는입니다 cwcch1.pdf, cwcch2.pdf, ..., cwcch9.pdf, cwcch10.pdf.

내가 궁극적으로하려고하는 것은 PDF와 pdftk다음을 연결하는 것입니다.

pdftk `ls *.pdf | sort -n` cat output output.pdf

그러나 정렬이 잘못되어 작동하지 않습니다.



답변

약간 다른 접근법이 필요하지만 이와 같은 것이 원하는 것을 할 수 있습니다.

pdftk $(for n in {1..18}; do echo cwcch$n.pdf; done) cat output output.pdf


답변

당신 sort은 당신 을 위해 이것을 할 수 있습니다 :

sort --version-sort


답변

이 특정 예제의 경우 다음을 수행 할 수도 있습니다.

ls *.pdf | sort -k2 -th -n

즉, 필드 구분 기호 (-th)로 ‘h’를 사용하여 두 번째 필드 (-k2)에서 숫자 (-n)를 정렬합니다.


답변

-vGNU에서이 옵션을 사용할 수 있습니다 ls: 텍스트 내 자연 정렬 (버전) 숫자.

ls -1v cwcch*

옵션이 다른 의미를 갖는 BSD ls(예 : OS X)에서는 작동하지 않습니다 -v.


답변

명령 행에서 직접 쉘 확장을 사용하십시오. 확장은 제대로 주문해야합니다. pdftk의 명령 줄 구문을 올바르게 이해 하면 원하는 작업을 수행합니다.

# shell expansion with square brackets
pdftk cwcch[1-9].pdf cwcch1[0-9].pdf cat output output.pdf

# shell expansion with curly braces
pdftk cwcch{{1..9},{10..18}}.pdf cat output output.pdf

또는 다른 접근 방식을 시도 할 수 있습니다. 이런 식으로해야 할 때는 보통 미리 숫자를 올바르게 형식화하려고합니다. 늦게 들어 와서 PDF가 이미 귀하의 예와 같이 번호가 매겨지면이 번호를 사용하여 번호를 다시 매길 것입니다.

# rename is rename.pl aka prename -- perl rename script
# this adds a leading zero to single-digit numbers
rename 's/(\d)/0$1/' cwcch[1-9].pdf

이제 표준 ls정렬이 제대로 작동합니다.


답변

다음은 sort를 사용하는 방법입니다.

ls | sort -k1.6n


답변

Sort -g 는 숫자를 오름차순으로 정렬하는 데 사용됩니다.

anthony@mtt3:~$ sort --help | egrep "\-g"
-g, --general-numeric-sort  compare according to general numerical value

다음 하나의 라이너는 PDF 파일 이름으로 파일을 반복하고 egrep -o 로만 숫자를 가져 오고 sort -g 를 사용 하여 숫자를 오름차순으로 정렬합니다 . 그런 다음이 숫자를 sed에 공급하고 연결합니다. 그런 다음 uniq으로 중복 출력을 제거합니다.

uniq 대신 awk를 사용할 수도 있습니다.

awk '!x[$0]++'

위의 내용은 uniq와 같습니다.

당신이 찾고있는 것은 하나의 라이너입니다.

for i in `cat tmp | egrep -o "[0-9]*" | sort -g`; do cat tmp | sed "s/\(^[a-z]*\)\([0-9]*\)\(\.pdf\)/\1$i\3/g" | uniq; done

tmp의 내용 :

anthony@mtt3:~$ cat tmp
cwcch10.pdf
cwcch11.pdf
cwcch12.pdf
cwcch13.pdf
cwcch14.pdf
cwcch15.pdf
cwcch16.pdf
cwcch17.pdf
cwcch18.pdf
cwcch1.pdf
cwcch2.pdf
cwcch3.pdf
cwcch4.pdf
cwcch5.pdf
cwcch6.pdf
cwcch7.pdf
cwcch8.pdf
cwcch9.pdf 

편집하다:

명령 출력 :

anthony@mtt3:~$ for i in `cat tmp | egrep -o "[0-9]*" | sort -g`; do cat tmp | sed "s/\(^[a-z]*\)\([0-9]*\)\(\.pdf\)/\1$i\3/g" | uniq; done

cwcch1.pdf
cwcch2.pdf
cwcch3.pdf
cwcch4.pdf
cwcch5.pdf
cwcch6.pdf
cwcch7.pdf
cwcch8.pdf
cwcch9.pdf
cwcch10.pdf
cwcch11.pdf
cwcch12.pdf
cwcch13.pdf
cwcch14.pdf
cwcch15.pdf
cwcch16.pdf
cwcch17.pdf
cwcch18.pdf