2012-06-06 51 views
3

我有一個名爲mail.txt文件,在其中行打印類似下面,我希望把所有這些線路在一個單行像的Perl放線在一個文件中的單個文件

感謝


這是輸入

q2VDWKkY010407 2221878 Sat Mar 31 19:37 <Mailer-daemon> 
        (host map: lookup (my.local.domain): deferred) 
              <[email protected]> 
              <[email protected]> 
q2VDWKkY010407 2221878 Sat Mar 31 19:37 <Mailer-daemon> 
        (host map: lookup (my.local.domain): deferred) 
              <[email protected]> 
              <[email protected]>

這是輸出

q2VDWKkY010407 2221878 Sat Mar 31 19:37 <Mailer-daemon>,(host map: lookup (my.local.domain): deferred),<[email protected]>,<[email protected]> 

q2VDWKkY010407 2221878 Sat Mar 31 19:37 <Mailer-daemon>,(host map: lookup (my.local.domain): deferred), <[email protected]>,<[email protected]>
+0

[重複](http:// stackoverflow。com/questions/10877118 /把相同的匹配模式放入單行中) – tuxuday

回答

2

那麼,爲什麼你不這樣做呢?

open(my $fh, "<", $input_filename); 

my @lines = map { chomp; $_} <$fh>; #1 

close $fh; 

open(my $out, ">", $output_filename); 

print $out join "", @lines; # or maybe a different separator, like "," 

close $out; 

#that's it 

注意:如果你想擺脫在開始和輸入線兩端多餘的空間,您可以通過

my @lines = map { s/\s+$//; s/^\s+//; $_} <$fh>; 
+0

謝謝jpalecek 我試過你提交的代碼,它沒有工作,它給了我相同的文件之前。 –

+0

@yagyavalkbhatt:是的,我總是忘記剝線終結者。它現在應該工作。 – jpalecek

+0

謝謝jpaleck 非常感謝它,但我唯一想要的是輸出像在後 當前我越來越q2VDWKkY010407 2221878 Sat Mar 31 19:37 (my.local.domain):deferred),<[email protected]>,<[email protected]>,q2VDWKkY010407 2221878 Sat Mar 31 19:37 ,(主機映射:lookup(my.local .domain):deferred),<[email protected]>,<[email protected]> 我希望\ n在> laas電子郵件ID的末尾 –

2

你似乎想介紹之間逗號分隔符代替線#1記錄之間連接的行和空行。

下面的代碼將帶有空格的行視爲連續行。我們將領先和尾隨空白以及粘合記錄一起剝離。

#! /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) 
              <[email protected]> 
              <[email protected]> 
q2VDWKkY010407 2221878 Sat Mar 31 19:37 <Mailer-daemon> 
        (host map: lookup (my.local.domain): deferred) 
              <[email protected]> 
              <[email protected]> 

輸出:

q2VDWKkY010407 2221878 Sat Mar 31 19:37 <Mailer-daemon>,(host map: lookup (my.local.domain): deferred),<[email protected]>,<[email protected]> 

q2VDWKkY010407 2221878 Sat Mar 31 19:37 <Mailer-daemon>,(host map: lookup (my.local.domain): deferred),<[email protected]>,<[email protected]>

上面的代碼中含有其自己的輸入。要在真實數據上使用它,請將# for demo only評論和整個__DATA__部分分開。然後你可以運行它作爲

$ join-lines mail-log

甚至

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

重定向標準輸出到文件oneline.log,運行它

$ join-lines mail-log >oneline.log
+0

感謝格雷格感謝您的答案,但我需要知道如何把它的輸出文件。 –

+0

@YagyavalkBhatt我建議爲此使用重定向,因爲這是最靈活的方法。查看更新的答案。 –

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) 
              <[email protected]> 
              <[email protected]> 
q2VDWKkY010407 2221878 Sat Mar 31 19:37 <Mailer-daemon> 
        (host map: lookup (my.local.domain): deferred) 
              <[email protected]> 
              <[email protected]> 

輸出

q2VDWKkY010407 2221878 Sat Mar 31 19:37 <Mailer-daemon>,(host map: lookup (my.local.domain): deferred),<[email protected]>,<[email protected]> 
q2VDWKkY010407 2221878 Sat Mar 31 19:37 <Mailer-daemon>,(host map: lookup (my.local.domain): deferred),<[email protected]>,<[email protected]> 
+0

感謝鮑羅廷的答覆,但我需要知道如何把它的輸出文件。 –

-1

我想出了這一點:

#!usr/bin/perl 
my $line; 
my $i = 0; 
open (FILE1, "<input.txt") or die "Can't find file";  
open (FILE2, ">output.txt") or die $!; 

while($line = <FILE1>){ 

    if ($line =~ /<Mailer-daemon>/) 
    { 
     #If it contains <Mailer-daemon> it retains its normal formatting./\ 

     print FILE2 substr($line, 0 , $line.length()-1); #chops off newline character 
     $i++; 
    } 
    else 
    { 
     $line =~ s/\s//g; #this regex kills all whitespace...not sutiable for mailer daemon lines. 
     print FILE2 $line; 
     $i++; 
    } 

    if ($i == 4) 
    { 
     #Every 4th line you want two newline characters as per sample output 
     print FILE2 "\n\n"; 
     $i = 0; 
    } 
    else 
    { 
     #comma seperator between non fourth-line parts 
     print FILE2 ", " 
    } 
} 

close FILE1; 
close FILE2; 

這是非常特殊的輸入和類似於你所付出的輸出。如果格式稍微改變,我也不會運行這個。

相關問題