3

以下のように行が印刷されるmail.txtというファイルがあります。これらの行をすべて1行にまとめたいと思います

ありがとう


これが入力です

q2VDWKkY010407 2221878 Sat Mar 31 19:37 <メーラーデーモン>
                     (ホスト マップ: ルックアップ (my.local.domain): 保留)
                                             <yagyavalkbhatt@yahoo.com>
                                             <ygyalkatt@yahoo.com>
q2VDWKkY010407 2221878 Sat Mar 31 19:37 <メーラーデーモン>
                     (ホスト マップ: ルックアップ (my.local.domain): 保留)
                                             <yagyavalkbhatt@yahoo.com>
                                             <yagyav@yahoo.com>

これが出力です

q2VDWKkY010407 2221878 Sat Mar 31 19:37 <Mailer-daemon>,(host map: lookup (my.local.domain): deferred),<yagyavalkbhatt@yahoo.com>,<ygyalkatt@yahoo.com>

q2VDWKkY010407 2221878 Sat Mar 31 19:37 <Mailer-daemon>,(host map: lookup (my.local.domain): deferred), <yagyavalkbhatt@yahoo.com>,<yagyav@yahoo.com>
4

4 に答える 4

2

結合された行の間にコンマ区切り文字を導入し、レコードの間に空白行を導入したいようです。

以下のコードは、先頭に空白がある行を継続行として扱います。先頭と末尾の空白を取り除き、レコードを接着します。

#! /usr/bin/env perl

use strict;
use warnings;

*ARGV = *DATA;  # for demo only

my $line;
while (<>) {
  s/\s+$//;

  if (s/^\s+//) {
    $line .= "," . $_;
    next;
  }
  else {
    print $line, "\n\n" if defined $line;
    $line = $_;
  }
}

print $line, "\n" if defined $line;

__DATA__
q2VDWKkY010407  2221878 Sat Mar 31 19:37 <Mailer-daemon>
                     (host map: lookup (my.local.domain): deferred)
                                             <yagyavalkbhatt@yahoo.com>
                                             <ygyalkatt@yahoo.com>
q2VDWKkY010407  2221878 Sat Mar 31 19:37 <Mailer-daemon>
                     (host map: lookup (my.local.domain): deferred)
                                             <yagyavalkbhatt@yahoo.com>
                                             <yagyav@yahoo.com>

出力:

q2VDWKkY010407 2221878 Sat Mar 31 19:37 <Mailer-daemon>、(host map:lookup(my.local.domain):deferred)、<yagyavalkbhatt@yahoo.com>、<ygyalkatt@yahoo.com>

q2VDWKkY010407 2221878 Sat Mar 31 19:37 <Mailer-daemon>、(host map:lookup(my.local.domain):deferred)、<yagyavalkbhatt@yahoo.com>、<yagyav@yahoo.com>

上記のコードには、独自の入力が含まれています。実際のデータで使用するには、# for demo onlyコメントとセクション全体を含む行をリモートし__DATA__ます。次に、次のように実行できます

$ join-linesmail-log

あるいは

$ join-lines mail-log1 mail-log2 mail-log3

標準出力をファイルにリダイレクトするには、次のoneline.logように実行します

$ join-lines mail-log> oneline.log
于 2012-06-06T11:18:06.430 に答える
2

空白で始まる行が継続行であると想定しても問題ない場合は、グローバル文字列変数に各複合レコードを蓄積することで、これを非常に簡単に行うことができます。

このプログラムは、必要なことを行います。このs/^\s+//ステートメントは、先頭の空白を削除し、その行が継続行かどうかを判断します。

use strict;
use warnings;

my $line = '';

while (<DATA>) {
  s/\s+\z//;
  if (s/^\s+//) {
    $line .= ','.$_;
  }
  else {
    print $line, "\n" if $line;
    $line = $_;
  }
}
print $line, "\n";

__DATA__
q2VDWKkY010407  2221878 Sat Mar 31 19:37 <Mailer-daemon>
                     (host map: lookup (my.local.domain): deferred)
                                             <yagyavalkbhatt@yahoo.com>
                                             <ygyalkatt@yahoo.com>
q2VDWKkY010407  2221878 Sat Mar 31 19:37 <Mailer-daemon>
                     (host map: lookup (my.local.domain): deferred)
                                             <yagyavalkbhatt@yahoo.com>
                                             <yagyav@yahoo.com>

出力

q2VDWKkY010407  2221878 Sat Mar 31 19:37 <Mailer-daemon>,(host map: lookup (my.local.domain): deferred),<yagyavalkbhatt@yahoo.com>,<ygyalkatt@yahoo.com>
q2VDWKkY010407  2221878 Sat Mar 31 19:37 <Mailer-daemon>,(host map: lookup (my.local.domain): deferred),<yagyavalkbhatt@yahoo.com>,<yagyav@yahoo.com>
于 2012-06-06T13:47:41.170 に答える