タブで区切られたファイル別列に基づく非辞書ソート

タブで区切られたファイル別列に基づく非辞書ソート

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(1行が1つのレコード)、-q(静的)、-n(キーフィールドの位置)、-s(ファイルの並べ替え、1行につき1つのキー)、 -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

関連情報