6

У меня есть куча текстовых лог-файлов в следующем формате:

ID          (17 characters)
Timestamp   (14 characters YYYYmmddHHMMSS e.g. "20060210100040" -> 2006/02/10 10:00:40)
Random data (? characters)
end of line

Файлы уже отсортированы по отметке времени. Мне нужно получить 1 файл журнала со всеми журналами из нескольких файлов журналов, отсортированных по отметке времени. Обратите внимание, что файлы журнала действительно огромные, около 3-4 ГБ каждый (и их десятки), я попробовал следующую команду:

sort -s -m -t '|' -k1n,1n +17 -o data_sort.txt *.TXT

Вот как я закончил с этой командой:

-s     : don't bother with tie results
-m     : merge all logs files
-t '|' : there is no | in my logs, so the whole line should be field 1
-k1n,1n: sort on the first field as a numeric value
+17    : the timestamp starts at index 17
-o     : output file

На самом деле ... это с треском проваливается. Выходной файл data_sort.txt является просто объединением всех файлов, не отсортированным вообще :(

Буду очень признателен, если кто-нибудь сможет оказать помощь по этой проблеме!

Спасибо

4 ответа4

8

man sort :

-m, - merge объединить уже отсортированные файлы; не сортировать

Символ «+» не отображается на моей справочной странице для сортировки. Так что я не знаю, как вы получаете +17. Если вы хотите использовать всю строку, вам не нужны -t или -k , так как по умолчанию начинается сортировка от начала строки до конца строки.

4

Ваш ключ должен быть -k1.17n и опускать -t и +17 .

Есть ли пробел между идентификатором и отметкой времени? Тогда отметка времени - это поле 2, а ключ должен быть -k2 .

2

Мне нравятся эти тяжелые ... это заставило меня задуматься:

По сути, он объединяет все файлы .txt, разделяет их двоеточиями (для сортировки), сортирует второе поле (сначала сначала сортирует r, вынимает его, если требуется последний последний), а затем удаляет двоеточия, показывая исходную строку. ,

cat *.txt
 | awk '{print substr($0,1,17)":"substr($0,18,14)":"substr($0,32)}'
 | sort -t: -k2,2 -nr -s
 | tr -d ':'

Я проверил это с тремя 4-строчными файлами .txt.

Первый файл

1234567890123456720100603104500Random text or data
2345678901234567820100602104500New Random Text
3456789012345678920100509213849Earlier Date
4567890123456789020100521195058InBetween Date

Второй файл

1234567890123456720100603124500File2 Random text or data
2345678901234567820100602124500File2 New Random Text
3456789012345678920100519213849File2 Earlier Date
4567890123456789020100523195058File2 InBetween Date

Третий файл

12345678901234567201106031045003Random text or data
23456789012345678201004021045003New Random Text
34567890123456789201007092138493Earlier Date
45678901234567890201005231950583InBetween Date

Результаты

12345678901234567201106031045003Random text or data
34567890123456789201007092138493Earlier Date
1234567890123456720100603124500File2 Random text or data
1234567890123456720100603104500Random text or data
2345678901234567820100602124500File2 New Random Text
2345678901234567820100602104500New Random Text
4567890123456789020100523195058File2 InBetween Date
45678901234567890201005231950583InBetween Date
4567890123456789020100521195058InBetween Date
3456789012345678920100519213849File2 Earlier Date
3456789012345678920100509213849Earlier Date
23456789012345678201004021045003New Random Text
0

Попробуйте сначала использовать cat для объединения файлов, а затем отсортируйте их. sort не будет путать с несколькими файлами, потому что она увидит один входной поток, поступающий из stdin.

Комбинация опций, которые вы используете для -t и -k похоже, вы пытаетесь сделать это вне того, что обычно делает. Сортировка работает с полями с определенными разделителями - пробел по умолчанию.

Возможно, вы захотите использовать некоторую комбинацию cut (для разбивки полей по байтам), awk чтобы объединить их, sort чтобы отсортировать строки, а затем awk чтобы воссоздать строки в их исходном формате.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .