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