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
@terdonが気づいたように、X
とY
が含まれていること、および数値が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
M
をX
の前に並べ替えられ、最後ではなく並べ替えられるため、これを追加しても、これはおそらく機能しません(通常は表示されると思います)。
あなたは使うことができます
cat number.txt|sort -n
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]}'))