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