유닉스 정렬로 여러 키 정렬
1-n 키로 정렬 해야하는 잠재적으로 큰 파일이 있습니다. 이러한 키 중 일부는 숫자 일 수 있고 일부는 아닐 수 있습니다. 이것은 너비가 고정 된 열 파일이므로 구분 기호가 없습니다.
유닉스 정렬로 이것을 수행하는 좋은 방법이 있습니까? 하나의 키로 '-n'을 사용하는 것만 큼 간단합니다. 매뉴얼 페이지를 읽고 Google을 간략하게 검색했지만 좋은 예를 찾지 못했습니다. 이것을 달성하려면 어떻게해야합니까?
참고 : 파일 크기 때문에 Perl을 배제했습니다. 최후의 수단이 될 것입니다.
-k옵션 (또는 --key=POS1[,POS2])을 사용하십시오 . 여러 번 나타날 수 있으며 각 키에는 전역 옵션 (예 : n숫자 정렬)이있을 수 있습니다.
그래도 조심하세요 :
파일을 주로 필드 3을 기준으로 정렬하고 두 번째로 필드 2를 기준으로 정렬하려면 다음과 같이하지 마십시오.
sort -k 3 -k 2 < inputfile
대신 이것을 원합니다 :
sort -k 3,3 -k 2,2 < inputfile
첫 번째는 필드 3의 시작 부분부터 줄 끝까지 (문자열이 고유 한) 문자열을 기준으로 파일을 정렬합니다.
-k, --key=POS1[,POS2] start a key at POS1 (origin 1), end it at POS2
(default end of line)
-k 옵션은 원하는 것입니다.
-k 1.4,1.5n -k 1.14,1.15n
첫 번째 필드에서 문자 위치 4-5를 사용하고 (고정 너비의 경우 하나의 필드 임) 첫 번째 키로 숫자 순으로 정렬합니다.
두 번째 키는 첫 번째 필드의 문자 14-15입니다.
(편집하다)
예 (내가 가지고있는 것은 DOS / cygwin 만 편리합니다) :
dir | \cygwin\bin\sort.exe -k 1.4,1.5n -k 1.40,1.60r
데이터 :
12/10/2008 01:10 PM 1,564,990 outfile.txt
월 번호 (pos 4-5)를 기준으로 디렉토리 목록을 숫자 순으로 정렬 한 다음 filename (pos 40-60)을 기준으로 역순으로 정렬합니다. 탭이 없으므로 정렬 할 모든 필드 1입니다.
다음은 csv 파일의 다양한 열을 숫자 및 사전 순서, 열 5 및 그 이후의 사전 순서로 정렬하는 방법입니다.
~/test>sort -t, -k1,1n -k2,2n -k3,3d -k4,4n -k5d sort.csv
1,10,b,22,Ga
2,2,b,20,F
2,2,b,22,Ga
2,2,c,19,Ga
2,2,c,19,Gb,hi
2,2,c,19,Gb,hj
2,3,a,9,C
~/test>cat sort.csv
2,3,a,9,C
2,2,b,20,F
2,2,c,19,Gb,hj
2,2,c,19,Gb,hi
2,2,c,19,Ga
2,2,b,22,Ga
1,10,b,22,Ga
-k1,1n은 1 열에서 시작하여 1 열에서 끝나는 숫자를 의미합니다. 아래에서 수행 한 경우 1, 2 열을 연결하면 1,10이 110으로 정렬됩니다.
~/test>sort -t, -k1,2n -k3,3 -k4,4n -k5d sort.csv
2,2,b,20,F
2,2,b,22,Ga
2,2,c,19,Ga
2,2,c,19,Gb,hi
2,2,c,19,Gb,hj
2,3,a,9,C
1,10,b,22,Ga
나는 당신의 경우를 믿습니다
sort -t@ -k1.1,1.4 -k1.5,1.7 ... <inputfile
더 잘 작동합니다. @는 필드 구분 기호이므로 아무 곳에도 나타나지 않는 문자인지 확인하십시오. 입력은 하나의 열로 구성된 것으로 간주됩니다.
편집 : 분명히 clintp는 이미 비슷한 대답을하였습니다. 죄송합니다. 그가 지적했듯이 플래그 'n'과 'r'은 모든 -k .... 옵션에 추가 될 수 있습니다.
-s스위치를 사용 하여 정렬을 안정화하기 위해 동일한 순위의 라인이 출력에서 원래의 상대 순서를 유지하도록하는 것도 바람직합니다.
I just want to add some tips, when you using sort , be careful about your locale that effects the order of the key comparison. I usually explicitly use LC_ALL=C to make locale what I want.
참고URL : https://stackoverflow.com/questions/357560/sorting-multiple-keys-with-unix-sort
'Programming' 카테고리의 다른 글
| Java로 맵을 인쇄하십시오 (0) | 2020.07.01 |
|---|---|
| node.js로 고유 ID를 생성하는 방법 (0) | 2020.07.01 |
| 협회를 통한 belongs_to (0) | 2020.07.01 |
| ASP.NET MVC 404 오류 처리 (0) | 2020.07.01 |
| SD 카드에서 파일을 삭제하는 방법? (0) | 2020.07.01 |