在perl中重新格式化文本

时间:2010-06-10 11:50:44

标签: perl awk

我有1000行文件,每行格式为

filename dd/mm/yyyy hh:mm:ss

我想将其转换为阅读

filename mmddhhmm.ss

试图在perl和awk中这样做 - 没有成功 - 会感激任何帮助

感谢

4 个答案:

答案 0 :(得分:4)

如果格式确实已修复,您可以进行简单的正则表达式替换:

s|(..)/(..)/.... (..):(..):(..)$|$2$1$3$4.$5|

我使用|作为分隔符,因此我不需要转义斜杠。

您可以在shell上使用Perl:

perl -pi -e 's|(..)/(..)/.... (..):(..):(..)$|$2$1$3$4.$5|' file

(使用man perlrun查找选项说明。)

答案 1 :(得分:1)

另一个有点丑陋的方法:foreach代码行($ str here)你从文件中得到这样的东西:

my $str = 'filename 26/12/2010 21:09:12';

my @arr1 = split(' ',$str);
my @arr2 = split('/',$arr1[1]);
my @arr3 = split(':',$arr1[2]);

my $day = $arr2[0]; 
my $month = $arr2[1]; 
my $year = $arr2[2];

my $hours = $arr3[0]; 
my $minutes = $arr3[1]; 
my $seconds = $arr3[2];

print $arr1[0].' '.$month.$day.$year.$hours.$minutes.'.'.$seconds;

答案 2 :(得分:1)

使用以下命令将文件传输到perl脚本:

while( my line = <> ){
    if ( $line =~ /(\S+)\s+\(d{2})\/(\d{2})/\d{4}\s+(\d{2}):(\d{2}):(\d{2})/ ) {
        print $1 . " " . $3 . $2 . $4 . $5 . '.' . $6;
    }
}

根据需要重定向输出。 这表示匹配线: (非空白&GT; = 1)空白&GT; = 1(2digits)/(2digits)/ 4digits whitepsace&GT; = 1(2digits):( 2digits):( 2digits)

捕获组在()从左到右编号为1到6。

答案 3 :(得分:0)

使用sed

sed -r 's|/[0-9]{4} ||; s|/||; s/://; s/:/./' file.txt
  • 删除年/yyyy
  • 删除剩余的斜杠
  • 删除第一个冒号
  • 将剩余的冒号更改为点

使用awk

awk '{split($2,d,"/"); split($3,t,":"); print $1, d[1] d[2] t[1] t[2] "." t[3]}'