按文本月排序

时间:2013-04-15 16:44:53

标签: perl sed awk

不确定实现此目的的最佳方法。

我将这些结果从mysql查询中获取到文本文件中。我想先排序最早的第4列。

10.xxx.xxx.xxx 70:xx:xx:xx:xx:xx Wed Apr 3 17:00:52 2013 Mon Apr 15 09:42:33 2013 10.xxx.xxx.xxx 70:xx:xx:xx:xx:xx Mon Apr 8 14:01:05 2013 Mon Apr 15 09:42:33 2013 10.xxx.xxx.xxx 70:xx:xx:xx:xx:xx Fri Apr 5 13:00:56 2013 Mon Apr 15 09:42:33 2013 10.xxx.xxx.xxx 70:xx:xx:xx:xx:xx Mon Apr 8 08:00:59 2013 Mon Apr 8 08:00:59 2013 10.xxx.xxx.xxx 70:xx:xx:xx:xx:xx Thu Mar 28 14:15:12 2013 Fri Apr 5 09:00:55 2013 10.xxx.xxx.xxx 70:xx:xx:xx:xx:xx Thu Mar 28 14:15:12 2013 Fri Apr 5 07:00:53 2013

sort -r -k10测试似乎没有削减它。

2 个答案:

答案 0 :(得分:1)

使用Time::Piece的Perl解决方案(自5.10.0以来的Perl标准库中)和Schwartzian变换。

#!/usr/bin/perl

use strict;
use warnings;
use 5.010;
use Time::Piece;

say map  { $_->[0] }
    sort { $a->[1] cmp $b->[1] }
    map  { [ $_, sortdate($_) ] } <DATA>;

sub sortdate {
  my $date = join ' ', (split)[2 .. 6];
  return Time::Piece->strptime($date, '%a %b %d %H:%M:%S %Y')->datetime;
}

__END__
10.xxx.xxx.xxx 70:xx:xx:xx:xx:xx Wed Apr 3 17:00:52 2013 Mon Apr 15 09:42:33 2013
10.xxx.xxx.xxx 70:xx:xx:xx:xx:xx Mon Apr 8 14:01:05 2013 Mon Apr 15 09:42:33 2013
10.xxx.xxx.xxx 70:xx:xx:xx:xx:xx Fri Apr 5 13:00:56 2013 Mon Apr 15 09:42:33 2013
10.xxx.xxx.xxx 70:xx:xx:xx:xx:xx Mon Apr 8 08:00:59 2013 Mon Apr 8 08:00:59 2013
10.xxx.xxx.xxx 70:xx:xx:xx:xx:xx Thu Mar 28 14:15:12 2013 Fri Apr 5 09:00:55 2013
10.xxx.xxx.xxx 70:xx:xx:xx:xx:xx Thu Mar 28 14:15:12 2013 Fri Apr 5 07:00:53 2013

答案 1 :(得分:0)

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION 
(
FOR /f "tokens=1-7*" %%a IN (sqlout.txt) DO (
SET "month="
FOR %%m IN (01 Jan 02 Feb 03 Mar 04 Apr 11 Nov 12 Dec) DO IF NOT DEFINED month (
IF %%d==%%m SET month=!prev!
SET prev=%%m
)
SET /a day=100+%%e
ECHO(%%g!month!!day!%%f*%%a %%b %%c %%d %%e %%f %%g %%h
)
)>tempfile.1

(
FOR /f "delims=" %%i IN ('sort tempfile.1') DO (
SET line=%%i
ECHO(!line:**=!
)
) >sortedoutput.txt

DEL tempfile.1 /F /Q

在样本数据上,有8个重要的列。其中,第四个是月,第五个日期,第六个和第七年。我不知道你所说的“第四”栏是“日期”是什么意思,因为每行有两个独立的日期。

该过程只需选取第四列,并查看月份数字(2位数)和月份缩写列表。保存前一个元素以便在比较下一个元素时更容易使用,因此当月份名与%% d中的第四列匹配时,month变量已设置,这将关闭该月的任何进一步处理。

您可能已经注意到我没有列出所有月份这会让您有所作为。除非所有月份都列入清单,否则显然不会有效。

接下来我们处理第五列,并在日期编号中添加100,产生一个从101到131的数字。这些数字都有三个字符。

接下来我们ECHO输出一串

  • %% g
  • 中第7列的年份
  • month
  • 中的2个字符的月份编号
  • 3位数的扩充日数
  • 第6栏的时间
  • 星号
  • 原始行的每个元素

下一步是在排序后阅读每一行。

  • 将排序的行设置为line
  • 回显从line到除第一个星号之外的所有内容。