Назад | Перейти на главную страницу

Solaris + сортировать файл по дате и времени командой sort

У меня есть список, созданный в /var/tmp/file.txt из какого-то скрипта (на машине Solaris), следующий список имеет 4 поля

пожалуйста, посоветуйте, как отсортировать список в соответствии со следующим TIMESTAMP (командой sort или другой командой 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

. . . .

Я пробую команду сортировки, но не понимаю, почему 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
sort -t' ' -k2.7,2.10n -k2.4,2.5n -k2.1,2.2n -k3

Если у вас есть контроль над исходным скриптом, поэтому вы можете распечатать дату как ГГГГ-ММ-ДД, тогда он будет сортировать естественным образом, поэтому нам не нужно будет разделять поля года, месяца и даты в команде сортировки, а можно просто использовать - 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)

В таких сложных случаях я обычно создаю временную базу данных 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 voodoo, чтобы сделать все это без базы данных. На мой взгляд, со сложными текстовыми файлами проще использовать базу данных.