プロジェクト

全般

プロフィール

ASCIIコードだけどEBCDICコードの順にソートしたい(シェル芸)

なんか、できるとは思ったんだけど結構考えてしまった
さんが5年以上前に追加

この記事はシェル芸 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/


コメント