Как перебрать каждую группу по несколько строк из текстового файла? - PullRequest
0 голосов
/ 03 января 2019

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

log_file.txt

#Date: 2018-01-01 11:12:33
value1:aaa
value2:bbb

#Date: 2018-01-03 11:12:33
value1:aaa
value2:ccc

#Date: 2017-05-12 22:12:33
value1:ddd
value2:aaa

Я ищу скрипт bash, например:

#!/usr/bin/env bash

for group_lines in $(<something log_file.txt init_match("#.*") end_match("\n")>)
do
  value1=$(echo -e "$group_lines"  | head -1 | sed 's/value1://g')
  value2=$(echo -e "$group_lines"  | head -2 | tail -1 | sed 's/value2://g')

  <do something value1 and value2>
done

Я думаю, что это с некоторым кодом awk.

Ответы [ 2 ]

0 голосов
/ 03 января 2019

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

$: while IFS=: read key val
> do case $key in
>    value1) value1=$val;;
>    value2) value2=$val
>            echo "<do something value1 and value2>: $value1 $value2";;
>    esac
> done < log_file.txt
<do something value1 and value2>: aaa bbb
<do something value1 and value2>: aaa ccc
<do something value1 and value2>: ddd aaa
0 голосов
/ 03 января 2019

Я нашел это. Сценарий:

#!/usr/bin/env bash

for line in $(cat log_file.txt | awk '/#/{flag=1;next; print line; line=""} /^$/{flag=0; line=""} {if (flag == 1) { if (length(line) == 0) {line=$0} else {line=line"|#@#|"$0}}} END{if (flag == 1) {print line}}')
do
  value1=$(echo $line | awk -F"[|]#@#[|]" '{print $1}')
  value2=$(echo $line | awk -F"[|]#@#[|]" '{print $2}')

  <do something value1 and value2>
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...