LoginSignup
1
0

More than 3 years have passed since last update.

【Linux】固定長ファイルをsortコマンドでキー指定してソートする

Last updated at Posted at 2019-07-27

はじめに

たとえば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/

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0