Сортировка файловой строки на основе выражения reg - PullRequest
0 голосов
/ 11 июня 2018

У меня есть строки в моем тестовом файле как

2018-05-28T17:13:08.024 {"operation":"INSERT","primaryKey":{"easy_id":1234},"subSystem":"ts\est","table":"tbl","timestamp":1527495188024}

Я должен отсортировать строки на основе поля timestamp.Я использовал sed для извлечения timestamp и пытался разместить в качестве 1-го столбца, используя sed -e 's/((?<=\"timestamp\":)\d+.*?)/\1.Может кто-нибудь помочь исправить рег.

Прямо сейчас получаю ошибку: sed: 1: "s/((?<=\"timestamp\":)\ ...": \1 not defined in the RE.Я думаю, что ошибка приходит из-за моего регулярного выражения.

Ответы [ 3 ]

0 голосов
/ 11 июня 2018

Вы также можете выполнить быструю реализацию с помощью gawk, не создавая промежуточных столбцов и т. Д.

Команда:

awk -F'"timestamp":' '{a[substr($2,1,length($2)-1)]=$0}END{asorti(a,b);for(i in b){print a[b[i]]}}' input

Пояснения:

  • -F'"timestamp":' вы определяете "timestamp": как разделитель полей
  • {a[substr($2,1,length($2)-1)]=$0} в каждой строке вашего файла вы сохраняете значение метки времени в качестве индекса и всегострока в ассоциативном массиве
  • END{asorti(a,b);for(i in b){print a[b[i]]}} в конце обработки вы сортируете ассоциативный массив по индексу (метке времени) и распечатываете содержимое массива на основе отсортированных индексов.

вход:

$ more input
2018-05-28T17:15:08.026 {"operation":"DELETE","primaryKey":{"easy_id":1236},"subSystem":"ts\est2","table":"tbl1","timestamp":1527495188026}
2018-05-28T17:13:08.024 {"operation":"INSERT","primaryKey":{"easy_id":1234},"subSystem":"ts\est","table":"tbl","timestamp":1527495188024}
2018-05-28T17:14:08.025 {"operation":"UPDATE","primaryKey":{"easy_id":1235},"subSystem":"ts\est1","table":"tbl1","timestamp":1527495188025}

выход:

awk -F'"timestamp":' '{a[substr($2,1,length($2)-1)]=$0}END{asorti(a,b);for(i in b){print a[b[i]]}}' input                      
2018-05-28T17:13:08.024 {"operation":"INSERT","primaryKey":{"easy_id":1234},"subSystem":"ts\est","table":"tbl","timestamp":1527495188024}
2018-05-28T17:14:08.025 {"operation":"UPDATE","primaryKey":{"easy_id":1235},"subSystem":"ts\est1","table":"tbl1","timestamp":1527495188025}
2018-05-28T17:15:08.026 {"operation":"DELETE","primaryKey":{"easy_id":1236},"subSystem":"ts\est2","table":"tbl1","timestamp":1527495188026}
0 голосов
/ 11 июня 2018

Вы можете использовать команду сортировки:

sort -t: -k8 inputfile

Здесь -t: позволяет двоеточию : быть разделителем.Сортировка выполняется по полю восьмого, потому что двоеточие в timestamp": - это двоеточие в строке.

0 голосов
/ 11 июня 2018

awk: Это решение работает в общем случае, когда timestamp может появляться где угодно:

awk 'BEGIN {FPAT="\"timestamp\": *[0-9]*"; PROCINFO["sorted_ in"]="@ind_num_asc" }
     { a[substr($1,13)]=$0 }
     END { for(i in a) print a[i] }' <file>

Это означает, что ваша строка содержит одно поле формы "timestamp": nnnnnnnn.Также предполагается, что все массивы отсортированы по возрастанию в зависимости от их ключа.Вторая часть удаляет часть "timestamp": из поля $1, которое теперь является ключом, и сохраняет его в массиве.В конце мы печатаем массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...