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/
コメント