web-dev-qa-db-ja.com

UNIXシェルで数値を並べ替える方法を教えてください。

Sortコマンドを使用して、このような数値をソートするにはどうすればよいですか。

10
11
12
1
13
14
15
16
17
18
19
20
21
2
22
3
4
5
6
7
8
9
X
Y
18
user1703276

@terdonが気づいたように、XYが含まれていること、および数値が1から22まで続くという事実は、これを人間の染色体の可能なリストとして識別します(そのため、染色体M(ミトコンドリア)が欠落している可能性があると彼は言っています)。

数値のリストをソートするには、通常、sort -nを使用します。

$ sort -n -o list.sorted list

ここで、listはソートされていないリストであり、list.sortedは結果のソートされたリストになります。

-nを使用すると、sortは入力に対して数値ソートを実行します。ただし、一部の入力は数値ではないため、結果はおそらく意図したものではありません。 XおよびYは、ソートされたリストの最後ではなく最初に表示されます(通常、性染色体は22番染色体の後にリストされます)。

ただし、sort -V(「バージョンソート」用)を使用すると、実際に必要なものが得られます。

$ sort -V -o list.sorted list
$ cat list.sorted
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
X
Y

MXの前に並べ替えられ、最後ではなく並べ替えられるため、これを追加しても、これはおそらく機能しません(通常は表示されると思います)。

34
Kusalananda

あなたは使うことができます

cat number.txt|sort -n
1
RAJ METRE

1..22、X、Y、Mの順に並べ替える必要がある場合は、並べ替えの前にX、Y、Mを数値に変換し、並べ替え後に戻すことができます。

sed 's/X/23/;s/Y/24/;s/M/25/' < file | sort -n | sed 's/23/X/;s/24/Y/;s/25/M/'

これらの数値がzsh配列にある場合、次のハックを使用して任意のソート順を適用できます。

k=({1..22} X Y M) v=({01..25})
typeset -A rank=(${k:^v})

unsorted=(22 Y 5 X M 13)
sorted=(/(e'{reply=($unsorted)}'oe'{REPLY=$rank[$REPLY]}'))
1