はじめに
たとえばCSVファイルなら何番目のフィールドをソートしたいというのが明確に決まっているのでキー指定は簡単だけど、区切り文字なしの固定長のファイルってどうしたらsortコマンドでソートできるだろうと思ってちょっと試しました。
結果的に以下のやり方でできました。
ソートするファイル
こんなファイルを用意する。
15文字の固定長ファイル。
~ $ cat test.txt
1FF11111AAA 100
1AB22222ZZZ 90
1BD33333AAA 60
2BC55555BBB 60
6BB55555AAA 60
7QQ55555AAA 001
9GG55555AAA
9CC55555AAA 30
123456789012345
~ $
このファイルに対して以下をソートキーとしてソートしたい。
- 第1キー:12文字目から15文字目を数値扱いで昇順
- 第2キー:2文字目から3文字目を昇順
sortコマンド
こんなオプションでソートできた。
sort -t$'\t' -k1.12,1.15n -k1.2,1.3 test.txt
tオプション
区切り文字の指定。ここで指定された区切り文字でフィールドが分割される。
固定長のファイルなので存在し得ない文字を指定し、1行=1フィールド扱いにする。
ここではタブ文字を指定している。
kオプション
キーを指定する。
「-k3」で3つ目のフィールドをキーとしてソートする。
あまり知られていないが(少なくとも自分は知らなかった。。)、実はフィールド内の文字位置を指定できるのでこれを利用して固定長ファイルのソートをする。
「-k[開始フィールド番号].[開始文字位置],[終了フィールド番号].[終了文字位置]」
nオプション
数値扱いでソートする。
複数キー指定する場合はnの位置に注意すること。
-nk1.12,1.15 -k1.2,1.3
-k1.12,1.15n -k1.2,1.3
確認
環境を用意するのが面倒なので以下のWEBサービスを利用。
http://s-macke.github.io/jor1k
~ $ sort -t$'\t' -k1.12,1.15n -k1.2,1.3 test.txt
9GG55555AAA
7QQ55555AAA 001
9CC55555AAA 30
6BB55555AAA 60
2BC55555BBB 60
1BD33333AAA 60
1AB22222ZZZ 90
1FF11111AAA 100
123456789012345
~ $
空白以降(12~15文字目)と2~3文字目でソートされていますね。
参考
https://kazmax.zpp.jp/cmd/s/sort.1.html
https://linuxcommand.net/sort/