Classificação não lexicográfica baseada em uma coluna de arquivo específica que é separada por tabulação [duplicada]

1

file.txt é separado por separadores:

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

Eu quero classificar as linhas para que elas apareçam no pedido 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
    
por bioinform 24.10.2017 / 11:09

2 respostas

4

Dada 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

Substitua as últimas palavras da linha por números. Ordenar usando esses números. Em seguida, substitua-as pelas palavras originais:

$ 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

Como alternativa, prefixar cada linha por um número, dependendo da última palavra na linha e classificar esse número. Em seguida, remova essa primeira coluna:

$ 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
    
por 24.10.2017 / 11:21
3

Este snippet:

# 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

produz:

-----
 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

usando msort , um código de ordenação alternativo encontrado em muitos repositórios. É mais lento que o tipo GNU, mas possui vários recursos adicionais que o tornam útil em muitas situações. As opções aqui são -Z (copiar primeira linha), -l (uma linha é um registro), -q (silencioso), -n (localização do campo chave), -s (arquivo de ordem de classificação, uma chave por linha), - c (tipo de comparação).

Isso foi em um sistema como:

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

Alguns detalhes para o 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)

Felicidades ... felicidades, drl

    
por 24.10.2017 / 13:03