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

なんか、できるとは思ったんだけど結構考えてしまった
Added by kanata about 1 month ago

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


Comments

Add picture from clipboard (Maximum size: 100 MB)