我有一个从某个脚本(在 Solaris 机器上)在 /var/tmp/file.txt 中创建的列表,以下列表有 4 个字段
请建议如何根据以下时间戳对列表进行排序(通过排序命令或其他 solaris 命令)
例如日期和时间 15-10-2009 08:29:18 应该在 15-10-2009 08:29:10 之前...等等
file.txt 示例(未排序文件)
PHONE_NUMBER TIMESTAMP ID TYPE
-------------------- ------------------- ---- --------------
972544111222 15-10-2009 08:29:18 20 sharp_gx10
33633333333 24-09-2009 16:17:45 20 other_mm_phone
841990000043 08-10-2009 09:04:38 60 other_mm_phone
972541230001 08-10-2009 14:23:48 20 other_mm_phone
。 。 。 。
我尝试了 sort 命令,但不清楚为什么 file.txt 没有排序
sort -t' ' -k2.7,2.10n -k2.4,2.5n -k2.1,2.2n -k3 /var/tmp/file.txt
我们得到输出:
5938123456789141 12-10-2009 13:09:22 20 other_phone
5511223322332233 07-03-2012 08:13:43 20 other_phone
888888 10-02-2012 14:13:58 60 LegacyPhone
111111 10-02-2012 14:13:59 60 LegacyPhone
777777 10-02-2012 14:13:59 60 LegacyPhone
999999 16-02-2012 14:07:32 10 other_phone
87654321 11-10-2009 09:39:37 10 other_phone
答案1
sort -t' ' -k2.7,2.10n -k2.4,2.5n -k2.1,2.2n -k3
如果您可以控制原始脚本,那么您可以将日期打印为 YYYY-MM-DD,然后它会自然排序,因此我们就不需要在排序命令中分开年份、月份和日期字段,而只需使用 -k2,就像我们使用 -k3 作为时间戳一样。
或者如果我正确计算了你的固定宽度格式,
sort -k1.28,1.31n -k1.25,1.26n -k1.22,1.23n -k3
或者如果你没有使用固定宽度并且有可变的空白,那么(-b
忽略空格但注意没有-n
)
sort -b -k2.7,2.10 -k2.4,2.5 -k2.1,2.2 -k3
或者只对文件的一部分进行排序(实际上,首先修改创建这些数据的程序会容易得多):
(head -2 file; /usr/xpg4/bin/tail -n +3 file |sort -b -k2.7,2.10 -k2.4,2.5 -k2.1,2.2 -k3)
答案2
对于这种复杂的情况,我倾向于创建一个临时的 MySQL 数据库,并让其进行排序或其他过滤。通常,这样做会更简单
CREATE TABLE temp_sort_table(phone_number VARCHAR(16), timestamp DATETIME, id INT, type VARCHAR(16))
然后将数据从文本文件导入到数据库:
LOAD DATA INFILE 'file.txt' INTO TABLE temp_sort_table
然后你就可以轻松地做类似的事情
SELECT * FROM temp_sort_table ORDER BY timestamp DESC;
当然,您可以将各种参数传递给sort
命令或使用一些awk/Perl/Python
巫术来完成所有这些操作,而无需数据库。在我看来,对于复杂的文本文件,使用数据库更容易。