0

不确定实现这一目标的最佳方法。

我从 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 test 似乎没有削减它。

4

2 回答 2

1

A Perl solution using Time::Piece (in the Perl standard library since 5.10.0) and a Schwartzian Transform.

#!/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
于 2013-04-15T20:47:34.973 回答
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出一串

  • 来自第 7 列的年份,以 %%g 为单位
  • 中的 2 个字符的月份编号month
  • 3 位数的增广天数
  • 从第 6 列开始的时间
  • 一个星号
  • 原行的每个元素

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

  • 将排序的行设置为line
  • 回显从line除了部分到第一个星号的所有内容。
于 2013-04-15T17:25:29.207 回答