파일 이름 부분이 여러 개인 파일을 정렬하는 방법은 무엇입니까?

파일 이름 부분이 여러 개인 파일을 정렬하는 방법은 무엇입니까?

내 파일 이름은 많은 파일에 대해 반복되는 형식입니다 STR_NUM1_STR_NUM2_NUM3_NUM4_STR.dat. 먼저 각 NUM1 그룹 과 각 NUM1 그룹 내 NUM1에서 파일을 정렬하고 싶습니다 . Bash에서 어떻게 할 수 있나요?NUM1NUM4

Tmp1_24298_Data_545_547_63359_Sample.dat
Tmp1_24298_Data_667_669_63637_Sample.dat
Tmp1_24298_Data_683_685_63517_Sample.dat
Tmp1_24298_Data_695_697_63557_Sample.dat
Tmp1_24298_Data_701_703_63437_Sample.dat
Tmp1_28703_Data_545_547_63833_Sample.dat
Tmp1_28703_Data_667_669_64111_Sample.dat
Tmp2_28703_Data_683_685_63951_Sample.dat
Tmp2_28703_Data_695_697_64031_Sample.dat
Tmp2_28703_Data_701_703_63910_Sample.dat
Tmp2_28707_Data_545_547_64306_Sample.dat
Tmp2_28707_Data_667_669_64545_Sample.dat
Tmp2_28707_Data_683_685_64424_Sample.dat
Tmp2_28707_Data_295_697_64505_Sample.dat
Tmp2_28707_Data_701_703_64344_Sample.dat

답변1

요약하자면, _필드 구분자로 두 번째 및 여섯 번째 필드의 숫자를 정렬하려고 합니다. 이 경우 파일 이름이 이름이 지정된 파일에 있으면 filenames(한 줄에 하나의 파일) 다음을 사용합니다.

$ sort -nt_ -k2,2 -k6,6 filenames
Tmp1_24298_Data_545_547_63359_Sample.dat
Tmp1_24298_Data_701_703_63437_Sample.dat
Tmp1_24298_Data_683_685_63517_Sample.dat
Tmp1_24298_Data_695_697_63557_Sample.dat
Tmp1_24298_Data_667_669_63637_Sample.dat
Tmp1_28703_Data_545_547_63833_Sample.dat
Tmp2_28703_Data_701_703_63910_Sample.dat
Tmp2_28703_Data_683_685_63951_Sample.dat
Tmp2_28703_Data_695_697_64031_Sample.dat
Tmp1_28703_Data_667_669_64111_Sample.dat
Tmp2_28707_Data_545_547_64306_Sample.dat
Tmp2_28707_Data_701_703_64344_Sample.dat
Tmp2_28707_Data_683_685_64424_Sample.dat
Tmp2_28707_Data_295_697_64505_Sample.dat
Tmp2_28707_Data_667_669_64545_Sample.dat

파일이 현재 디렉터리에 있는 경우 POSIX 솔루션은 다음과 같습니다.

$ find . -maxdepth 1 -type f -name '*.dat' | sort -nt_ -k2,2 -k6,6
Tmp1_24298_Data_545_547_63359_Sample.dat
Tmp1_24298_Data_701_703_63437_Sample.dat
Tmp1_24298_Data_683_685_63517_Sample.dat
Tmp1_24298_Data_695_697_63557_Sample.dat
Tmp1_24298_Data_667_669_63637_Sample.dat
Tmp1_28703_Data_545_547_63833_Sample.dat
Tmp2_28703_Data_701_703_63910_Sample.dat
Tmp2_28703_Data_683_685_63951_Sample.dat
Tmp2_28703_Data_695_697_64031_Sample.dat
Tmp1_28703_Data_667_669_64111_Sample.dat
Tmp2_28707_Data_545_547_64306_Sample.dat
Tmp2_28707_Data_701_703_64344_Sample.dat
Tmp2_28707_Data_683_685_64424_Sample.dat
Tmp2_28707_Data_295_697_64505_Sample.dat
Tmp2_28707_Data_667_669_64545_Sample.dat

어떻게 작동하나요?

  • -nsort숫자순으로 정렬하라고 알려주세요 .

  • -t_필드 구분 기호 sort로 사용되도록 지시합니다 ._

  • -k2,2 -k6,6 두 번째 필드가 정렬되었음을 나타내며 sort, 두 번째 필드가 동일하면 여섯 번째 필드가 정렬됩니다.

GNU 솔루션(개행 문자가 포함된 파일 이름 처리)

줄바꿈이 포함된 파일 이름을 처리하려면 NUL 구분을 사용해야 합니다. 이는 -print0with find-zwith를 사용 sort하고 출력을 인쇄 가능하게 만들고 여기에 표시하려면 다음을 사용하여 NUL을 줄 바꿈으로 변환하는 것을 의미합니다 tr.

$ find . -maxdepth 1 -type f -name '*.dat' -print0 | sort -znt_ -k2,2 -k6,6 | tr '\0' '\n'
./Tmp1_24298_Data_545_547_63359_Sample.dat
./Tmp1_24298_Data_701_703_63437_Sample.dat
./Tmp1_24298_Data_683_685_63517_Sample.dat
./Tmp1_24298_Data_695_697_63557_Sample.dat
./Tmp1_24298_Data_667_669_63637_Sample.dat
./Tmp1_28703_Data_545_547_63833_Sample.dat
./Tmp2_28703_Data_701_703_63910_Sample.dat
./Tmp2_28703_Data_683_685_63951_Sample.dat
./Tmp2_28703_Data_695_697_64031_Sample.dat
./Tmp1_28703_Data_667_669_64111_Sample.dat
./Tmp2_28707_Data_545_547_64306_Sample.dat
./Tmp2_28707_Data_701_703_64344_Sample.dat
./Tmp2_28707_Data_683_685_64424_Sample.dat
./Tmp2_28707_Data_295_697_64505_Sample.dat
./Tmp2_28707_Data_667_669_64545_Sample.dat

관련 정보