Как получить несколько строк и отформатировать их перед печатью - PullRequest
0 голосов
/ 26 июня 2018

У меня есть текстовый файл, как показано ниже:

cat file.txt
<Some text here>
<Some text here>
Animal: type=Reptile age=17 s=M val=snake
   Animal Code: 123
   Animal Color: Black
Animal: type=Reptile age=20 s=M val=Lizard
   Animal Code: 200
   Animal Color: light_Brown
<Some text here>
<Some text here>

Здесь, из файла выше

  1. Я хочу извлечь строки, соответствующие шаблону 1 Animal: type=Reptile шаблону 2 Animal Color:
  2. В извлеченных строках я хочу найти «Code», «val» и «Color»

В настоящее время я использовал ниже:

awk '/Animal.*Reptile/,/Animal Color:/' file.txt | grep "Animal Code:\|val\|Animal Color:" | awk '{ if ($5 != NULL ) print $5 ; else print $3; }' | tr "=" "\n" | grep -v val

Вывод этого следующий:

snake
123
Black
Lizard
200
light_Brown

Я хочу, чтобы вывод был отформатирован как Код, значение, Цвет , показанный ниже:

123,snake,Black
200,Lizard,light_Brown

Как этого добиться ??

Ответы [ 2 ]

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

Это позволит вам печатать любые поля в любом порядке по их имени:

$ cat tst.awk
BEGIN { FS="[: =]+"; OFS="," }
/Animal/ {
    sub(/^ +/,"")
    for (i=2; i<NF; i+=2) {
        f[$i] = $(i+1)
    }
    if (/Color/) {
        print f["Code"], f["val"], f["Color"], f["age"], f["s"], f["type"]
        delete f
    }
}

$ awk -f tst.awk file
123,snake,Black,17,M,Reptile
200,Lizard,light_Brown,20,M,Reptile

Массаж для костюма.

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

awk и grep не очень сильны, когда дело доходит до нескольких строк - они оба лучше всего работают по одной строке за раз. Awk может запомнить что-то из одной строки и использовать это в другой, так что в вашем конкретном случае только awk может выполнить эту работу, но это требует немного работы.

Я предполагаю, что порядок линий фиксирован, поэтому вы не получите строку «Цвет животного» перед «Кодом животного» для того же животного. Кроме того, val =? считается самой последней вещью в строке «Animal:».

как насчет этого:

awk_prog='
/^Animal: type=Reptile/ { sub(".*val=",""); val=$0 }
/Animal Code: / { code=$NF }
/Animal Color: / { color=$NF ; print code "," val "," color }
'
awk "$awk_prog" file.txt

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

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