+, - 같은 특수문자 정렬

+, - 같은 특수문자 정렬

여러 행과 열로 구성된 파일이 있습니다. 열은 \t로 구분됩니다. 이제 두 번째 열을 기준으로 파일을 정렬하고 싶습니다. 예를 들어 다음과 sort -f -t$'\t' -k2 file.txt같이 수행할 수 있습니다. 그러나 두 번째 열에는 +, o-. +상단, o중간, 하단을 -정렬하는 방법은 무엇입니까 ?

또한 열 5라는 또 다른 열이 있는데 해당 열에 대한 파일을 정렬하려고 합니다. 다만, n위, s중간, 아래 순 으로 개인순서를 지정하고 싶습니다 l.

내 목표를 효과적으로 달성할 수 있는 프로그램이 있다면 이 솔루션을 선호합니다. 그렇지 않으면 자체 작성 기능을 찾고 있습니다.

답변1

DSU, 장식-정렬-비장식 또는 슈워츠 변환이라는 기술이 있습니다.

기본 접근 방식은 데이터의 조합이 될 수 있는 자신만의 대리 키를 만드는 것입니다(레코드의 모든 부분에서 추출되며 다른 필드에 따라 달라질 수 있음). 이것들은 원하는 중요도 순서대로 순위를 매기면 됩니다. 예를 들어 숫자 필드를 0으로 채우는 것이 도움이 되는 경우가 많습니다. 입력 라인 번호를 최종 자식으로 추가하여 최종 주문을 안정적으로 만들 수 있습니다. 전체 키 길이는 모든 레코드에서 동일해야 합니다.

그런 다음 -k1.1 순서(전체 레코드)에 따라 정렬됩니다. 일반적으로 정렬은 각 비교에 대해 두 개의 다중 키를 다시 작성하므로 이는 일반적으로 다중 키 정렬보다 빠릅니다.

마지막으로 고정 길이 장식을 잘라 장식 정렬의 출력을 취소합니다.

답변2

sort대용량 파일인 경우에는 계속 사용할 수 있습니다 .

#!/usr/bin/env bash

perl -F'\t' -ne '{$F[1] =~ s/o/,/; $F[4] =~ s/l/t/; print join "\t",@F}' file|\
sort -t $'\t' -k 2,2 -k 5,5 |\
perl -F'\t' -ne '{$F[1] =~ s/,/o/; $F[4] =~ s/t/l/; print join "\t",@F}'

첫 번째 Perl 스크립트는 정렬을 준비하기 위해 o,번째 및 다섯 번째 l열을 변경합니다.t

두 번째 Perl 스크립트가 다시 변경됩니다.

관련 정보