탭으로 구분된 파일별 열을 기반으로 한 비사전식 정렬

탭으로 구분된 파일별 열을 기반으로 한 비사전식 정렬

file.txt탭으로 구분됩니다.

RollNo  Names    Class  Subject  Position
101     Anna     V      Maths    Average
102     Bob      V      Maths    Good
103     Charles  VI     Science  Good
104     Darwin   VI     Science  Improve
105     Eva      VII    English  Improve

Good이 줄을 , , Average순서로 표시 하도록 정렬하고 싶습니다 Improve.

RollNo  Names    Class  Subject  Position
102     Bob      V      Maths    Good
103     Charles  VI     Science  Good
101     Anna     V      Maths    Average
104     Darwin   VI     Science  Improve
105     Eva      VII    English  Improve

답변1

반면 file.txt:

RollNo  Names    Class  Subject  Position
101     Anna     V      Maths    Average
102     Bob      V      Maths    Good
103     Charles  VI     Science  Good
104     Darwin   VI     Science  Improve
105     Eva      VII    English  Improve

줄의 마지막 단어를 숫자로 바꿉니다. 이 숫자를 사용하여 정렬하세요. 그런 다음 이를 원래 단어로 바꿉니다.

$ sed -e 's/Good$/1/' -e 's/Average$/2/' -e 's/Improve$/3/' file.txt | sort -k5n | sed -e 's/1$/Good/' -e 's/2$/Average/' -e 's/3$/Improve/'
RollNo  Names    Class  Subject  Position
102     Bob      V      Maths    Good
103     Charles  VI     Science  Good
101     Anna     V      Maths    Average
104     Darwin   VI     Science  Improve
105     Eva      VII    English  Improve

또는 해당 줄의 마지막 단어를 기준으로 각 줄 앞에 숫자를 추가한 다음 해당 숫자를 기준으로 정렬합니다. 그런 다음 첫 번째 열을 삭제합니다.

$ awk 'NR==1 {n=0} $NF=="Good" {n=1} $NF=="Average" {n=2} $NF=="Improve" {n=3} { print n, $0 }' file.txt | sort -n | cut -d' ' -f2-
RollNo  Names    Class  Subject  Position
102     Bob      V      Maths    Good
103     Charles  VI     Science  Good
101     Anna     V      Maths    Average
104     Darwin   VI     Science  Improve
105     Eva      VII    English  Improve

답변2

이 스니펫:

# Utility functions: print-as-echo, print-line-with-visual-space.
pe() { for _i;do printf "%s" "$_i";done; printf "\n"; }
pl() { pe;pe "-----" ;pe "$*"; }

pl " Input data file $FILE:"
head $FILE

pl " Sort order file:"
head data2

pl " Expected output:"
head $E

pl " Results:"
msort -q -Z -l -n 5,5 -s data2 -c lexicographic $FILE

생산하다:

-----
 Input data file data1:
RollNo  Names   Class   Subject Position
101     Anna    V       Maths   Average
102     Bob     V       Maths   Good
103     Charles VI      Science Good
104     Darwin  VI      Science Improve
105     Eva     VII     English Improve

-----
 Sort order file:
Good
Average
Improve

-----
 Expected output:
RollNo  Names   Class   Subject Position
102     Bob     V       Maths   Good
103     Charles VI      Science Good
101     Anna    V       Maths   Average
104     Darwin  VI      Science Improve
105     Eva     VII     English Improve

-----
 Results:
RollNo  Names   Class   Subject Position
102     Bob     V       Maths   Good
103     Charles VI      Science Good
101     Anna    V       Maths   Average
104     Darwin  VI      Science Improve
105     Eva     VII     English Improve

사용하여종류, 많은 저장소에서 발견되는 대체 정렬 코드입니다. GNU 정렬은 속도가 느리지만 여러 상황에서 유용하게 사용할 수 있는 추가 기능이 많이 있습니다. 여기의 옵션은 -Z(첫 번째 줄 복사), -l(한 줄이 하나의 레코드), -q(조용함), -n(키 필드 위치), -s(파일 정렬, 줄당 하나의 키), -c( 비교형).

이것은 다음과 같은 시스템에 있습니다.

OS, ker|rel, machine: Linux, 3.16.0-4-amd64, x86_64
Distribution        : Debian 8.9 (jessie) 
bash GNU bash 4.3.30

msort에 대한 일부 세부 정보:

msort   sort records in complex ways (man)
Path    : /usr/bin/msort
Version : 8.53
Type    : ELF64-bitLSBexecutable,x86-64,version1(SYSV ...)
Help    : probably available with -h,--help
Repo    : Debian 8.9 (jessie) 
Home    : http://www.billposer.org/Software/msort.html (pm)

행운을 빕니다... 건배, drl

관련 정보