Как получить последнее вхождение файла и сортировать по отметке времени, используя AWK в Unix - PullRequest
0 голосов
/ 07 октября 2019

Ниже приведен пример содержимого файла hb_20190930103450.log

   <------some lines------->
      [2019-09-30 19:55:59] [MERGE] : ####### BEGIN - claim_response - '2016-01-15' - #######
      <------some lines---------> 
      [2019-09-30 20:17:11] [MERGE] : ####### BEGIN - compound_ingred - '2016-01-15' - #######
  <-------some lines---------->

здесь $ 1 - это [2019-09-30, $ 2 - 20:17:11], а $ 8 - составная_ингуляция

Я использую эту команду, чтобы получить список строк из множества похожих файлов, таких как hb_20190930103450.log. Я использую hb_2019 * .log, который включает в себя BEGIN в строке и получает столбцы $ 1, $ 2, $ 8 из строки, включающей BEGIN вместе симена файлов и добавление
их в файл startdate.txt.

  awk '/BEGIN/ {print FILENAME,$1,$2,$8}' hb_2019*.log > sdate.txt

Ниже приведен результат выполнения вышеприведенной команды, которая выдает все файлы во всех файлах журнала

hb_20190927121800.log [2019-09-27 20:45:56] ser_message1
hb_20190927121800.log [2019-09-27 20:45:58] claim_response
hb_20190927121800.log [2019-09-27 20:46:00] compound_ingred
hb_20190927121800.log [2019-09-27 20:47:36] pha_ree
hb_20190930103448.log [2019-09-29 10:34:48] ser_message1
hb_20190930103448.log [2019-09-29 11:58:22] claim_response
hb_20190930103448.log [2019-09-29 14:17:28] mcompound_ingred
hb_20190930103448.log [2019-09-29 15:05:48] pha_ree
hb_20190930103450.log [2019-09-30 19:11:25] ser_message1
hb_20190930103450.log [2019-09-30 19:55:59] claim_response
hb_20190930103450.log [2019-09-30 20:17:11] compound_ingred
hb_20190930103450.log [2019-09-30 20:17:13] pha_ree

Ниже приведено то, что я пытаюсь, но не повезло

  awk '/BEGIN/ {print FILENAME,$1,$2,$8}' hb_2019*.log |sort|uniq > sdate.txt

Кто-нибудь сталкивался с этим и имел успех?

пример ожидаемого результата должен выглядеть следующим образом только с самыми последними из записей таблиц

hb_20190930103450.log [2019-09-30 19:11:25] ser_message1 
hb_20190930103450.log [2019-09-30 19:55:59] claim_response 
hb_20190930103450.log [2019-09-30 20:17:11] compound_ingred 
hb_20190930103450.log [2019-09-30 20:17:13] pha_ree

Ответы [ 3 ]

1 голос
/ 08 октября 2019

вместо этого передают выходные данные

$ ... | sort -k4 -k2,3r | uniq -f3 | sort -k2,3

hb_20190930103448.log [2019-09-29 14:17:28] mcompound_ingred
hb_20190930103450.log [2019-09-30 19:11:25] ser_message1
hb_20190930103450.log [2019-09-30 19:55:59] claim_response
hb_20190930103450.log [2019-09-30 20:17:11] compound_ingred
hb_20190930103450.log [2019-09-30 20:17:13] pha_ree

, сортируют по имени и отметке времени (в порядке убывания) и выбирают первую запись с помощью uniq, снова сортируют по времени.

0 голосов
/ 07 октября 2019

Еще один снимок в темноте:

$ awk '
FNR==1 { b="" }
/BEGIN/ { b=b (b==""?"":ORS) FILENAME OFS $1 OFS $2 OFS $8 }
END { print b }' hb_2019*.log

Обновление: Специальная версия для набора образцов данных, используйте приведенные выше для фактических данных (т. Е. Поля FILENAME, $2, $3, $4 вместоFILENAME, $1, $2, $8):

$ awk 'FNR==1{b=""}{b=b (b==""?"":ORS) FILENAME OFS $2 OFS $3 OFS $4}END{print b}' hb_201909*
hb_20190930103450.log [2019-09-30 19:11:25] ser_message1
hb_20190930103450.log [2019-09-30 19:55:59] claim_response
hb_20190930103450.log [2019-09-30 20:17:11] compound_ingred
hb_20190930103450.log [2019-09-30 20:17:13] pha_ree
0 голосов
/ 07 октября 2019

Я понимаю, что у вас есть различные ключи (ser_message1, claim_response, compound_ingred, ...), из которых вы хотите младшая запись для ключа отключить все файлы hb_2019*.log. Мы можем сделать это легко, отслеживая время на ключ. Я сделаю предположение, что полный составной набор файлов неупорядочен во времени :

$ awk '!/BEGIN/ { next }
       { key=$8; timestring=$1$2 }
       (! (key in time)) || (timestring > time[key]) {
          time[key]=timestring
          msg[key] = FILENAME OFS $1 OFS $2 OFS $8
       }
       END { for(key in time) print msg[key] }
      ' hb_2019*.log | sort -k2,3
...