読者です 読者をやめる 読者になる 読者になる

部屋を掃除したら漫画が沢山出てきたので書く日記

漫画とか合唱とかUNIXとかLinuxとかについて書く日記です。

二つのファイルの行を一つの行にまとめて出力する

二つのファイルの行を一つの行に、たとえばタブ区切りで並べて出力できればグラフにする時に便利だなあとずっと思っていたので、perlで作ってみました。名前はmerge_2file.plとしてみました。

ソース

#!/usr/bin/perl

use strict;
use warnings;

#引数が二個入力されてなかったら終了
if (@ARGV != 2){
die "usage: merge_2file.pl FILE1 FILE2\n";
}

my $i = 0;

#FILE1読み込み
open(IN1, "$ARGV[0]") or die "file open error:$!\n";
#FILE1の中身を配列に格納
my @array1 = <IN1>;
#FILE1のクローズ
close(IN1);

#FILE2読み込み
open(IN2, "$ARGV[1]") or die "file open error:$!\n";
#FILE2の中身を配列に格納
my @array2 = <IN2>;
#FILE2のクローズ
close(IN2);

foreach (@array2){
  #改行コード削除
  chomp($array1[$i]);
  #出力
  print $array1[$i] , "\t" , "$_";
  $i += 1;
}

使い方

merge_2file.pl tmp.list tmp2.list

tmp.listの中身が

10:01
10:02
:

tmp2.listの中身が

10.5
20.5
:

だとすると、実行すると

10:01 10.5
10:02 20.5
:

になります。素晴らしい。

・・・と、自己満足に浸っていたところ、LinuxSolarisの標準コマンドで同じ機能が実現されている事を知りました。

ここここで説明されているpasteというコマンドを使ってみたら、私の作ったスクリプトと同じ動作になりました。いや、pasteは三つ以上のファイルも読み込めるみたいなので、むしろ優れています(当たり前です)。

ああ、これが「便利な道具があるにも関わらず、一から同じ道具を作ってしまう無駄」、すなわち車輪の再発明ってやつですか・・・。がっかり。

せっかくなので使い方の説明です。

pasteの使い方

paste tmp.list tmp2.list

ファイルは上と同じです。実行すると

10:01 10.5
10:02 20.5
:

となります。

paste -d "," tmp.list tmp2.list

とdオプションをつけてやると、

10:01,10.5
10:02,20.5
:

というように、区切り文字を変更できます。

せっかく作った道具がすでに存在したのは残念ですが、一から作った満足感は残ったので良しとしますわ・・・。

ではー。