ASCIIコードだけどEBCDICコードの順にソートしたい(シェル芸)
なんか、できるとは思ったんだけど結構考えてしまった
この記事はシェル芸 Advent Calendar 2019の13日目の記事です。
カレンダーに空きがあって、せっかくなので、ちょっと前に書いたブログに加筆して再公開します
それでですね、標題の話を聞いた。よくある話らしい
つまり、今までメインフレームでソート処理してたんだけど、オープン化したら文字コードがASCIIに変わってソートした結果の並び順が変わってしまった。前と同じにしたい、と。。
ASCIIコードとEBCDICコードは同じアルファベットでも割り当てられている値が異なるので、当然そのままソートすると結果が異なる
文字コード¶
ASCIIコード¶
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | |
---|---|---|---|---|---|---|---|---|
0 | NUL | DLE | SP | 0 | @ | P | ` | p |
1 | SOH | DC1 | ! | 1 | A | Q | a | q |
2 | STX | DC2 | " | 2 | B | R | b | r |
3 | ETX | DC3 | # | 3 | C | S | c | s |
4 | EOT | DC4 | $ | 4 | D | T | d | t |
5 | ENQ | NAC | % | 5 | E | U | e | u |
6 | ACK | SYN | & | 6 | F | V | f | v |
7 | BEL | ETB | ' | 7 | G | W | g | w |
8 | BS | CAN | ( | 8 | H | X | h | x |
9 | HT | EM | ) | 9 | I | Y | i | y |
A | LF/NL | SUB | * | : | J | Z | j | z |
B | VT | ESC | + | ; | K | [ | k | { |
C | FF | FS | , | < | L | \ (¥ ) | l | | |
D | CR | GS | - | = | M | ] | m | } |
E | SO | RS | . | > | N | ^ | n | ‾ |
F | SI | US | / | ? | O | _ | o | DEL |
列が上位3ビット、行が下位4ビットを表す
例えば、"a"だったら0x61
ASCIIコードは7bitで文字を表現している
EBCDICコード(英小文字を拡張したケース)¶
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | NUL | DLE | DS | (予約) | SP | & | - | { | } | \ | 0 | |||||
1 | SOH | DC1 | SOS | (予約) | / | a | j | ~ | A | J | 1 | |||||
2 | STX | DC2 | FS | SYN | b | k | s | B | K | S | 2 | |||||
3 | ETX | TM | WUS | IR | c | l | t | C | L | T | 3 | |||||
4 | SEL | RES/ENP | BYP/INP | PP | d | m | u | D | M | U | 4 | |||||
5 | HT | NL | LF | TRN | e | n | v | E | N | V | 5 | |||||
6 | RNL | BS | ETB | NBS | f | o | w | F | O | W | 6 | |||||
7 | DEL | POC | ESC | EOT | g | p | x | G | P | X | 7 | |||||
8 | GE | CAN | SA | SBS | h | q | y | H | Q | Y | 8 | |||||
9 | SPS | EM | SFE | IT | i | r | z | I | R | Z | 9 | |||||
A | RPT | UBS | SM/SW | RFF | ¢ | ! | ¦ | : | ||||||||
B | VT | CU1 | CSP | CU3 | . | $ | , | # | ||||||||
C | FF | IFS | MFA | DC4 | < | * | % | @ | ||||||||
D | CR | IGS | ENQ | NAK | ( | ) | _ | ' | ||||||||
E | SO/LS1 | IRS | ACK | (予約) | + | ; | > | = | ||||||||
F | SI/LS0 | IUS/ITB | BEL | SUB | ¬ | ? |
列が上位4ビット、行が下位4ビットを表す
例えば、"a"だったら0x81
という訳で数字、英小文字、英大文字の出現順番が違うのでソートしても同じ結果にならないんですね
テストデータ¶
$ cat testdata.txt
AAA1001
ABA0100
BBB0010
XXX0201
01C0020
02D0002
90E3000
普通にソート¶
$ cat testdata.txt |sort
01C0020
02D0002
90E3000
AAA1001
ABA0100
BBB0010
XXX0201
アルファベットから始まるデータが後ろに来ている
EBCDICのコード順でソートした場合を想定すると英大文字、英小文字、数字の順でソートされるはず
EBCDIC順にソートシェル芸¶
こんな感じかな
$ cat testdata.txt|tr a-zA-Z0-9 0-9A-Za-z|sort|tr 0-9A-Za-z a-zA-Z0-9
AAA1001
ABA0100
BBB0010
XXX0201
01C0020
02D0002
90E3000
数字、英小文字、英大文字をEBCDICの順番に文字を入れ替えた上でソートして、ソート後にもとに戻す
厳密には、記号の並び順までtrで対応付けなければいけないと思うけれど、こんな感じでいけるのでは
trめっちゃ便利やなぁ
関連情報¶
漢数字ソートを応用してもできる気がする
上田ブログ 本日観測したシェル芸その2(漢数字のソート)
https://b.ueda.tech/?post=10610
俺的備忘録 〜なんかいろいろ〜 ターミナル上で漢数字ソートを行う
https://orebibou.com/2017/10/%E3%82%BF%E3%83%BC%E3%83%9F%E3%83%8A%E3%83%AB%E4%B8%8A%E3%81%A7%E6%BC%A2%E6%95%B0%E5%AD%97%E3%82%BD%E3%83%BC%E3%83%88%E3%82%92%E8%A1%8C%E3%81%86/
コメント