Слияние и сортировка нескольких файлов с “видом”

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

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 является просто конкатенацией всех файлов, не отсортированных вообще :(

Я был бы очень признателен, если кто-либо мог бы обеспечить какую-либо справку на этой проблеме!

Спасибо

9
задан 03.06.2010, 16:52

4 ответа

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

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

5
ответ дан 07.12.2019, 13:16

man sort чтения:

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

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

9
ответ дан 07.12.2019, 13:16

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

По существу это связывает все .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 ':'

Я протестировал его с тремя .txt файлами с 4 строками.

Первый файл

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
2
ответ дан 07.12.2019, 13:16

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

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

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

0
ответ дан 07.12.2019, 13:16

Теги

Похожие вопросы