Unix 다중 열 정렬 문제

Unix 다중 열 정렬 문제

파일을 정렬하려고 합니다.

TX001;A0004|Number|5|0|Y|1        
TX001;A0110|VARCHAR|5|0|Y|4         
TX001;A1332|VARCHAR|15|0|Y|3         
TX001;B3321|VARCHAR|15|0|Y|5         
TX001;C1321|VARCHAR|15|0|Y|2      
TY001;A1234|Number|5|0|Y|3        
TY001;C2335|VARCHAR|5|0|Y|1        
TY001;B2133|VARCHAR|15|0|Y|2        
TZ001;A1234|Number|5|0|Y|3    
TZ001;A2133|VARCHAR|5|0|Y|1  
TZ001;C0133|VARCHAR|15|0|Y|2

예상되는 출력은 다음과 같습니다.

TX001;A0004|Number|5|0|Y|1   
TX001;C1321|VARCHAR|15|0|Y|2   
TX001;A1332|VARCHAR|15|0|Y|3  
TX001;A0110|VARCHAR|5|0|Y|4  
TX001;B3321|VARCHAR|15|0|Y|5  
TY001;C2335|VARCHAR|5|0|Y|1  
TY001;B2133|VARCHAR|15|0|Y|2  
TY001;A1234|Number|5|0|Y|3  
TZ001;A2133|VARCHAR|5|0|Y|1      
TZ001;C0133|VARCHAR|15|0|Y|2  
TZ001;A1234|Number|5|0|Y|3

마지막 숫자 열을 기준으로 정렬해야 합니다. sort 를 사용하려고 하면 -n첫 번째 열의 순서가 변경됩니다.

을 사용해 보았지만 sort -t "|" -k 6,6n FNAM.txt숫자 정렬로 인해 첫 번째 열 순서가 변경되었습니다.

테이블 이름의 첫 번째 열은 영향을 받지 않은 상태로 유지하면서 마지막 열을 기준으로 숫자순으로 정렬해야 합니다.

답변1

무엇이든POSIX 호환 sort:

sort -t"|" -k1,1.6 -k6n file
  • -t"|"구분 기호를 로 설정합니다 |.
  • -k1,1.6첫 번째 필드를 처음부터 6번째 문자까지 정렬합니다.1.
  • -k6n그런 다음 6번째 필드를 숫자순으로 정렬합니다.

1맨페이지에서:

POS is F[.C][OPTS], where F is the field number and C the character position in the field;

답변2

sort다양한 유형의 여러 열을 정렬하는 것이 가능하지만 구분 기호는 단일 문자여야 합니다. 예제를 처리하고 예상되는 출력을 생성하려면 첫 번째 ';'를 '|'로 바꾸고 첫 번째 열을 숫자순으로 정렬한 다음(이전의 여섯 번째 열) 마지막으로 첫 번째 '|' ';':

sed 's/;/|/' < FNAM.txt | sort -t\| -k1,1 -k7,7n | sed 's/|/;/'

당신이 시도한 변형,

sort -t "|" -k 6,6n FNAM.txt

전체 파일을 여섯 번째 열에서만 숫자로 정렬합니다. sort사용자가 알려주지 않은 구조를 모르므로 처음 몇 문자로 줄을 그룹화해야 한다는 것을 알지 못합니다. 따라서 마지막 열이 완전히 정렬되어 결과적으로 테이블 이름이 혼합됩니다.

관련 정보