文字列を連番で貼り付ける

Perl覚え書き - なんとな~くしあわせ?の日記 にインスパイヤされて、文字列を連番で貼り付けてみます。

もちろん、Perl を持ち出すまでもなく、awk で十分作成することができます。

まず、以下のようなサンプルを用意します。

$ cat test.txt
名無しさん@涙目です。</b>(福岡県)<b><><>2011/12/04(日) 12:58:41.92 ID:9YW2pdlZ0 BE:981326827-PLT(12000) ポイント特典<> sssp://img.2ch.net/ico/purin1.gif <br>  <br>   ソニー、東芝、日立製作所と官民ファンドの産業革新機構はこのほど、 <br>  中小型液晶パネル事業の統合会社「ジャパンディスプレイ」を設立すると発表した。 <br>  <br>   中国の市場調査会社、奥維コンサルティング(AVC)の金暁鋒副総経理は 、 <br> 「日本企業全体の動向としては収縮の方向にある」と指摘。 <br>  <br>   時 価総額の底打ちにしても、売り上げ計画の下方調整にしても、 <br> 日本の電化製品のブランド価値が徐々に色あせているのは事実で、かつての輝きを失いつつある。 <br> 中国網日本語版(チャイナネット)が報じた。以下は同記事より。 <br>  <br>   一流の製 造能力と技術の優位性が日本企業のもっとも重要な核心競争力だった。 <br> 業界関係者によると、2000年からソニーはブラジル、インド、中国などの新興市場に注目していたが、 <br> これらの市場でのサポートをおこたり、最初の数年間、ソニーは広告予算も引き上げなかった。 <br>  <br>   それに対し、サムスンは技術的には劣るが、中国市場進 出当初、消費者のニーズを重視し、 <br> 「中国人に好かれる企業に」というのが一時サムスンの代表的なスローガンだった。 <br>  <br> 続きます <br>  <br> http://news.searchina.ne.jp/disp.cgi?y=2011&d=1201&f=business_1201_145.shtml <br>  <br>  <>【 徹底討論】衰退がヤバイ日本の製造業。なぜ没落してしまったのか。どうしてこうなった
名無しさん@涙目です。</b>(岩手県)<b><><>2011/12/04(日) 13:00:11.36 ID:AwL1kVxM0<> 糞ジャップがアホだからだろwwwwwwwwwwwwwwwwwwwwwwwww w <>
名無しさん@涙目です。</b>(アラバマ州)<b><><>2011/12/04(日) 13:00:53.42 ID:v0A9g8EeP<> 「政治」の一言だろ <br> 政治能力の無い日本というプラットフォームの限界だ <>
名無しさん@涙目です。</b>(大阪都)<b><><>2011/12/04(日) 13:01:20.80 ID:AwUyLC030<> 円高の影響で国内で10万円で売ってるつもりでも <br> 海外から見たら20万円で売っ てるように見えるからな <br>  <>
名無しさん@涙目です。<br>(四国地方)<b><>sage<>2011/12/04(日) 13:01:48.86 ID:EO6fJTJmP<> 「安さ」ではなく技術と付加価値で勝負に失敗したから(=^^=) <>
名無しさん@涙目です。</b>(福岡県)<b><><>2011/12/04(日) 13:02:05.58 ID:9YW2pdlZ0 BE:700947252-PLT(12000)<> sssp://img.2ch.net/ico/purin1.gif <br>  <br> <a href="../test/read.cgi/news/1322971121/1" target="_blank">&gt;&gt;1</a>の続き <br>  <br>  <br>   自身の技術に固持し、重要な転換期で行動が鈍かったことが、日本企業の 第2の衰退を招いた。 <br> 家電専門家は、「日本企業の新製品開発に対する意欲は当時 ほどなく、新製品はどれも保守的。 <br> それに比べサムスンなど韓国企業はかなり積極的だ」と話す。 <br>  <br>   保守的な心理が企業管理にも反映されているという。 <br> 日本企業の管理体系ではずっと海外の子会社の実権を非常に制限し、多くの権利を日 本の本社に集中させている。 <br> こうした管理体制によって市場の反応に対応できなかった。 <br>  <br>   日本企業の衰退を簡単に市場の不景気と片付けるわけにはいかな い。 <br> 繁栄時代の長期戦略から核心技術に固執する戦略に加え、保守的かつ封鎖的な内部管理体制、 <br> 日本企業の衰退は少しずつ身体をむしばんでいく病気が表面化する過程に似ている。 <br>  <br> 終わり <br>  <br> http://news.searchina.ne.jp/disp.cgi?y=2011&d=1201&f=business_1201_145.shtml <br>  <br>  <br>  <br>  <>
名無しさん@涙目です。</b>(アラバマ州)<b><> <>2011/12/04(日) 13:02:53.45 ID:/4dgCeau0<> イノベーションだろ(キリッ <>
名無しさん@涙目です。</b>(奈良県)<b><><>2011/12/04(日) 13:03:04.52 ID:NXfcoUyp0<> 安さだけじゃなく品質も負けました <br> 技術立国(笑) <>
名無しさん@涙目です。</b>(WiMAX)<b><>sage<>2011/12/04(日) 13:04:53.45 ID:+XfxBFpk0<> また産業構造の転換期に来てるのに老害どもが古い産業にしがみついてるからだろ <>
名無しさん@涙目です。</b>(神奈川県)<b><><>2011/12/04(日) 13:05:05.97 ID:yFwZnsUc0<> 最近の日本製電化製品の魅力のなさは異常 <br> こじつけのような機能高付加価値 だかを付けて価格吊り上げようとしてるのが丸見え。 <br> それならシンプルで安い海外製の方がマシ・・・。 <>

やっている内容は Perl覚え書き - なんとな~くしあわせ?の日記 の Perl スクリプトと同じです。

#! /usr/local/bin/nawk -f
## add_str.awk
## 特定の文字列を貼り付ける

BEGIN {
    str = "ね こ 大 好 き い ぬ 嫌 い 。 。 。 。 。 。 。 。 "\
          "別に文章はどんなでも良かった です";
    arr_num = split(str, arr);
}

{
    gsub(/名無しさん/, "Anonymous");
    gsub(/涙目です。/, "2ch");
    gsub(/[0-9][0-9]:[0-9][0-9]:[0-9][0-9]\.[0-9][0-9] .*/, arr[NR]);
    ## gawk4 であれば、以下でも構わない
    ###gsub(/[[:digit:]]{2}:[[:digit:]]{2}:[[:digit:]]{2}.[[:digit:]]{2} .*/, arr[NR]);

    print $0;
}

配列を生成するのに split() 関数で文字列から分割しています。

また、gawk4 であれば、正規表現も拡張されていますので、分かりやすく記述できますが、結果的に長くなってしまいました。

実行してみます。

$ gawk -f add_str.awk test.txt
Anonymous@2ch</b>(福岡県)<b><><>2011/12/04(日) ね
Anonymous@2ch</b>(岩手県)<b><><>2011/12/04(日) こ
Anonymous@2ch</b>(アラバマ州)<b><><>2011/12/04(日) 大
Anonymous@2ch</b>(大阪都)<b><><>2011/12/04(日) 好
Anonymous@2ch<br>(四国地方)<b><>sage<>2011/12/04(日) き
Anonymous@2ch</b>(福岡県)<b><><>2011/12/04(日) い
Anonymous@2ch</b>(アラバマ州)<b><> <>2011/12/04(日) ぬ
Anonymous@2ch</b>(奈良県)<b><><>2011/12/04(日) 嫌
Anonymous@2ch</b>(WiMAX)<b><>sage<>2011/12/04(日) い
Anonymous@2ch</b>(神奈川県)<b><><>2011/12/04(日) 。

こんな感じで出力されます。

ちなみに Perl は初心者なのですが、Perl で書くと以下のような感じでしょうか。

#! /usr/bin/perl
## add_str.pl
## 特定の文字列を貼り付ける

use strict;
use warnings;
use utf8;

use Encode qw/encode decode/;
my $encoding = 'UTF-8';

my $str = "ね こ 大 好 き い ぬ 嫌 い 。 。 。 。 。 。 。 。 " .
          "別に文章はどんなでも良かった です";

my @arr = split(/ /, $str);

my ($file) = @ARGV;

open my $file_fh, '<', $file
    or die "Can't open file $file : $!";

my $i;

while (my $line = <$file_fh>) {
    $line = decode($encoding, $line);
    chomp $line;

    $line =~ s|名無しさん|Anonymous|g;
    $line =~ s|涙目です。|2ch|g;
    $line =~ s|[\d]{2}:[\d]{2}:[\d]{2}.[\d]{2}.*|$arr[$i++]|;

    $line = encode($encoding, $line);

    print "$line\n";
}

close $file_fh
    or die "Can't close file $file : $!";

1;

間違っていたらごめんなさい。

日本語を扱う場合には、awk の場合、スクリプトも入力ファイルも同じ文字コード (ここでは UTF-8 を想定) でなければうまく処理できませんが、Perl であれば decode で内部バイト文字列にして encode で UTF-8 にすることでいろいろな文字コードに対応できます。

tag_nawk.png tag_nawk.png tag_nawk.png tag_nawk.png