![파일 이름별로 파일 경로 목록을 정렬하는 방법은 무엇입니까?](https://linux55.com/image/188865/%ED%8C%8C%EC%9D%BC%20%EC%9D%B4%EB%A6%84%EB%B3%84%EB%A1%9C%20%ED%8C%8C%EC%9D%BC%20%EA%B2%BD%EB%A1%9C%20%EB%AA%A9%EB%A1%9D%EC%9D%84%20%EC%A0%95%EB%A0%AC%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
files.txt라는 텍스트 파일에 다음 파일 목록이 있습니다.
./themes/seven/images/list-item-rtl.png
./themes/seven/images/arrow-desc.png
./themes/seven/images/arrow-prev.png
./themes/seven/images/fc-rtl.png
./themes/seven/ie7.css
./xmlrpc.php
./MAINTAINERS.txt
./update.php
./README.txt
./COPYRIGHT.txt
./web.config
파일 이름으로만 정렬하고 싶습니다(마지막 슬래시 이후의 첫 번째 문자 기준). 따라서 위의 출력은 다음과 같습니다.
./COPYRIGHT.txt
./MAINTAINERS.txt
./README.txt
./themes/seven/images/arrow-desc.png
./themes/seven/images/arrow-prev.png
./themes/seven/images/fc-rtl.png
./themes/seven/ie7.css
./themes/seven/images/list-item-rtl.png
./update.php
./web.config
./xmlrpc.php
어떻게 해야 하나요?
답변1
$ awk -F '/' '{ printf "%s/%s\n", $NF, $0 }' files.txt | sort | cut -d '/' -f 2-
./COPYRIGHT.txt
./MAINTAINERS.txt
./README.txt
./themes/seven/images/arrow-desc.png
./themes/seven/images/arrow-prev.png
./themes/seven/images/fc-rtl.png
./themes/seven/ie7.css
./themes/seven/images/list-item-rtl.png
./update.php
./web.config
./xmlrpc.php
이렇게 하면 줄 앞에 파일 이름 복사본이 추가되고 그 뒤에 /
문자 하나가 추가됩니다. 파일 이름은 /
마지막으로 구분된 필드를 통해 가져옵니다. 마지막 필드 $NF
는 에 있습니다 awk
.
명령의 출력이 awk
정렬됩니다. 이 정렬 /
에서는 행 앞에 추가된 -delimited 필드를 사용합니다 . cut
그런 다음 추가된 구분 필드를 제거하는 데 사용됩니다 /
.
이 접근 방식은 경로 이름에 리터럴 개행 문자가 포함되지 않는 한 작동합니다.
/
경로 이름이 문자(디렉토리의 경로 이름)로 끝나는 경우에도 문제가 발생할 수 있습니다. 그러면 정렬 열에 빈 문자열이 생성됩니다.
또한보십시오:슈워츠 변환
답변2
GNU awk( gawk
)를 사용하여 배열 순회를 지정합니다.
awk -F'/' 'BEGIN {PROCINFO["sorted_in"] = "@ind_str_asc"}
{ a[$NF]=$0 }
END { for ( i in a ) { print a[i] } }' files.txt
이 경우 데이터는 배열에 로드되고 인덱스는 마지막으로 구분된 필드(예: 파일 이름)로 정의되며 /
요소는 파일의 행입니다. 그런 다음 인쇄 단계의 인덱스 값으로 정렬된 배열을 반복합니다.
기본 유틸리티만:
paste <(rev files.txt | cut -d'/' -f 1 | rev) files.txt | sort | cut -f2