이름의 일부로 정렬된 다른 이름의 파일을 인쇄하는 방법은 무엇입니까?

이름의 일부로 정렬된 다른 이름의 파일을 인쇄하는 방법은 무엇입니까?

다음과 같은 이름의 파일이 많이 있습니다.

n2+_PiU_w4_5348757.out
n2+_PiU_w2_5348755.out
n2+_PiU_w1_5348742.out
n2+_PiU_w1_5348729.out
n2+_PiU_w1_5348696.out
n2+_PiU_st3_w3_part6_5630814.out
n2+_PiU_st3_w3_part6_5630721.out
n2+_PiU_st3_w3_part5_5630720.out
n2+_PiU_st3_w3_part4_5630813.out

문제는 완전히 다른 이름을 가질 수 있으므로 이전 번호 (예: ID) .out를 기준으로 정렬 해야 한다는 것입니다.

나는 비슷한 질문을 보았습니다 (세 번째 열을 기준으로 정렬,Linux 정렬 마지막 열), 하지만 사용할 수 없거나 필요에 맞게 sed사용할 수 없습니다.awk

정렬하는 방법을 제안해 주실 수 있나요? 사용하는 것이 가장 좋습니다 bash.

답변1

최근(>4.0) GNU awk의 경우 숫자(마지막에서 두 번째) 필드로 입력되는 연관 배열을 사용합니다.

printf '%s\0' * | gawk '
  BEGIN {
    RS="\000"; FS="[_.]"; 
    PROCINFO["sorted_in"]="@ind_num_asc"
  } 
  {
    a[$(NF-1)]=$0
  } 
  END {
    for (k in a) print a[k]
}' 

전임자.

printf '%s\0' * | gawk 'BEGIN{RS="\000"; FS="[_.]"; PROCINFO["sorted_in"]="@ind_num_asc"} {a[$(NF-1)]=$0} END {for (k in a) print a[k]}' 
n2+_PiU_w1_5348696.out
n2+_PiU_w1_5348729.out
n2+_PiU_w1_5348742.out
n2+_PiU_w2_5348755.out
n2+_PiU_w4_5348757.out
n2+_PiU_st3_w3_part5_5630720.out
n2+_PiU_st3_w3_part6_5630721.out
n2+_PiU_st3_w3_part4_5630813.out
n2+_PiU_st3_w3_part6_5630814.out

마찬가지로 Perl 해싱을 사용하면 다음과 같습니다.

printf '%s\0' * | perl -F'[_.]' -0ne '
  $h{$F[$#F-1]} = $_ }{ for $k (sort { $a <=> $b } keys %h) {print "$h{$k}\n"}
'

답변2

공으로 zsh:

$ printf '%s\n' *_<->.out(noe'(REPLY=${REPLY##*_})')
n2+_PiU_w1_5348696.out
n2+_PiU_w1_5348729.out
n2+_PiU_w1_5348742.out
n2+_PiU_w2_5348755.out
n2+_PiU_w4_5348757.out
n2+_PiU_st3_w3_part5_5630720.out
n2+_PiU_st3_w3_part6_5630721.out
n2+_PiU_st3_w3_part4_5630813.out
n2+_PiU_st3_w3_part6_5630814.out
  • <->: 일련의 숫자( <x-y>제한 없음)
  • (...): 전역 한정자
  • n: 숫자 순서
  • oe'(code)': 다음 평가를 기준으로 정렬되었습니다 code.
  • REPLY=${REPLY##*_}: 정렬 키는 마지막 키 다음 부분입니다._

답변3

awk+sort+cut콤비네이션:

awk -F'_' '{ $0=$NF OFS $0 }1' files_list.txt | sort | cut -d' ' -f2-
  • -F'_'- 필드 구분 기호
  • $NF- 마지막 필드(예 5348696.out)
  • $0=$NF OFS $0- 추가 직접 정렬을 위해 현재 레코드 앞에 $0마지막 필드 값을 추가합니다(예: ).$NF5348757.out n2+_PiU_w4_5348757.out
  • cut -d' ' -f2-- 두 번째 필드부터 시작하는 필터 필드

산출:

n2+_PiU_w1_5348696.out
n2+_PiU_w1_5348729.out
n2+_PiU_w1_5348742.out
n2+_PiU_w2_5348755.out
n2+_PiU_w4_5348757.out
n2+_PiU_st3_w3_part5_5630720.out
n2+_PiU_st3_w3_part6_5630721.out
n2+_PiU_st3_w3_part4_5630813.out
n2+_PiU_st3_w3_part6_5630814.out

관련 정보