argius note

プログラミング関連

固定長テキストを項目でソートする

先日ひさびさにPerlを使ってツールを作りました。もうソラで書く自身はあまりありませんが、CVSのhistoryコマンドで得た出力を編集したいというのを頼まれたので、ちょっと作ってみました。

#!/usr/bin/perl
# sorter.pl

use strict;

# 固定長テキスト→配列
my @rows = ();
while (<>) {
  my @row = unpack "A2 A23 A8 A5 A37 A38 A*", $_;
  push @rows, \@row;
}
# ソート
my @sorted = sort {
  $b->[3] cmp $a->[3] ||   # revision (reverse)
    $a->[4] cmp $b->[4] || # path
      $a->[5] cmp $b->[5]  # file
    } @rows;
# フォーマット出力
for (@sorted) {
  printf "%s %-4s %s/%s\n"
    , $_->[1], $_->[3], $_->[5], $_->[4];
  # updated time, revision, path+file
}

exit;

使い方は以下の通り。

$ cvs history -x M -z +0900 | ./sorter.pl