Unix系では、コマンド sort と uniq を使用することにより、テキストファイル内の文字列を並べ替えて重複除去する方法がありますが、Windowsにおいても、Perlがインストールされていれば同じ結果を得ることができます。
本記事では、Perlワンライナーでテキストファイルのソートと重複除去を行う処理を紹介します。
実現したいこと
以下の入力ファイルの中身の文字列をソート・重複除去して表示する。
input.txt
bbbbbbb
aaaa
ccccccccccc
aaaa
処理結果
aaaa
bbbbbbb
ccccccccccc
サンプルコード
以下の処理は、input.txtの内容の重複を除去し、ソートした結果を返すワンライナーです。
perl -ne "$seen{$_}++; END { print for sort keys %seen; }" input.txt
使用したオプションは以下の通りです。
- -n:各入力行に対して指定されたコードを実行します。出力にはprint等が必要です。
- -e:直後に続く文字列をPerlプログラムとして実行します。
- END{}:ファイルの読み込みが完了した後に実行されます。
- print for sort keys %seen は、ハッシュ %seen のキーをソートしたものをループして、それぞれの要素を表示する、という書き方です。(forの部分はforeachと書いても同じ動きをします。ワンライナーでは短い方を選びたいのでforと書いています)
ワンライナーと同じ処理を書いてみる
以下は、上記ワンライナーと同じ動きをするperlスクリプトです。
#!/usr/bin/perl
# 入力ファイルをオープン
open(INPUT, '<', 'input.txt') or die("Cannot open file: $!");
# 入力ファイルから各行を読み込み、ハッシュに記録
while (my $line = <INPUT>) {
$seen{$line}++; # 文字列を回数をカウント(改行含む)
}
# ファイルハンドルをクローズ
close(INPUT);
# ハッシュのキーをソートし出力
foreach my $line (sort keys %seen) {
print $line;
}
これだけの処理を1行にまとめられるなんて、ワンライナーは便利ですね。
まとめ
本記事では、Perlワンライナーでテキストファイルのソートと重複除去を行う処理を紹介しました。システムの標準コマンドにない機能も簡単に作れてしまうのがPerlワンライナーの魅力です。ぜひご活用ください。