我有1000行文件,每行格式为
filename dd/mm/yyyy hh:mm:ss
我想将其转换为阅读
filename mmddhhmm.ss
试图在perl和awk中这样做 - 没有成功 - 会感激任何帮助
感谢
答案 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]}'