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