Вопрос: Объединение и сортировка нескольких файлов с помощью «сортировки»


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

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

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

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
2018-06-03 13:52


Источник


Любой ответ, который предполагает, что конкатенация файлов вначале явно не учитывает тот факт, что их размеры указаны в GB. - OrangeDog


Ответы:


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

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


4
2018-06-03 15:23



Проблема в том, что в идентификаторе может быть пробел, поэтому метка времени может быть полем 1 или полем 2, поэтому я попытался исправить его в поле 1 с помощью -t '|' трюк: / - NewbiZ
@NewbiZ: Тогда -k1.17n должно сработать. - Dennis Williamson


man sort гласит:

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

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


7
2018-06-03 14:01



-m немного двусмыслен info coreutils sort states: Объедините данные файлы, отсортировав их как группу. Каждый входной файл всегда должен быть индивидуально отсортирован. Думал, что он будет объединять и сортировать локально отсортированные файлы. «+» тоже не отображается в моем человеке, но я видел, как люди используют на некоторых веб-страницах, и я не нашел другого способа указать, где находится метка времени в строке - NewbiZ


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

По сути, он объединяет все .txt-файлы, разделяет их на colons (для сортировки), сортирует второе поле (сначала сортирует 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

1
2018-06-03 16:38





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

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

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


0
2018-06-03 14:28