grep или awk, как преобразовать данные в несколько столбцов в CSV-файле - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть следующие данные файла журнала

2/1/1/2/tasdfn.c:

LOG:
        backslash-newline should be deleted before tokenizing
    No diagnostics line
--
2/1/1/2/tlsdf.c:

LOG:
+++ stderr ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
tlsdf.c:15:5: error: use of undeclared identifier 'wchar_t'
--
2/2/4/1/tasdf.gen(0):

LOG:
    511 external identifiers in one source file
    Compilation failed ungracefully
--
2/2/4/1/tiasdf.gen(0):

LOG:
    8 nesting levels of #include files
    Compilation failed ungracefully
--

И хотел бы преобразовать вышеуказанные данные в следующее: где coulmn1 должно testname (т.е. 2/1/1/2 / testname.c) и coulmn2 должно LOG, подробности:

Ожидаемый вывод в CSV-файл:

2/1/1/2/tasdfn.c:           LOG:
                            backslash-newline should be deleted before tokenizing
                            No diagnostics line


2/1/1/2/tlsdf.c:            LOG:
                            +++ stderr ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
                            tlsdf.c:15:5: error: use of undeclared identifier 't'



2/2/4/1/tasdf.gen(0):       LOG:
                            511 external identifiers in one source file
                            Compilation failed ungracefully

Невозможно получить желаемый результат от grep и awk. Используя grep, я могу получить testname i.e и записать детали как отдельный вывод

cat test.log | grep -Ea '*.c:$|*.gen\([0-9]\):' //prints testname
cat test.log | grep -Ea '*.c:$|*.gen\([0-9]\):' -A4 //prints testname with Log details

как получить данные в указанном формате, где .csv файл в качестве вывода ??

1 Ответ

0 голосов
/ 07 ноября 2018

После обновления:

awk '/^--/{printf "\n\n"; f=0; next }
     !f { printf "%-29s%s\n", $0, "LOG:"; f=1; next}
     /^$/{next}
     /LOG:/{next}
     {sub(/ */,""); printf "%-29s%s\n", "", $0}' file

Это близко к тому, что вы хотите, но мне пришлось добавить дополнительный пробел во второе сообщение журнала, чтобы оно заработало:

awk 'BEGIN{RS="\n> -- *\n *"; FS="  +" }
     { gsub(/\n>|LOG:/,"") }
     { sub(/^ /,"",$1); sub(/:*$/,":",$1); printf "%-29s%s\n",$1,"LOG:"}
     { for(i=2;i<=NF; ++i) printf "%-29s%s\n","",$i; printf "\n\n" }' file

Идея состоит в том, чтобы awk определял записи, которые делятся на \n> -- *\n *, и поля, которые делятся на несколько пробелов (поэтому мне нужно было добавить дополнительный пробел после +++++++++++...).

выход:

2/1/1/2/tasdfn.c:            LOG:
                             backslash-newline should be deleted before tokenizing
                             No diagnostics line


2/1/1/2/tlsdf.c:             LOG:
                             +++ stderr ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
                             tlsdf.c:15:5: error: use of undeclared identifier 't'


2/2/4/1/tasdf.gen(0):        LOG:
                             511 external identifiers in one source file
                             Compilation failed ungracefully


2/2/4/1/tiasdf.gen(0):       LOG:
                             8 nesting levels of #include files
                             Compilation failed ungracefully --

исходный ввод:

> 2/1/1/2/tasdfn.c:
> 
> LOG:      backslash-newline should be deleted before tokenizing   No
> diagnostics line
> -- 
>2/1/1/2/tlsdf.c:
> 
> LOG:
> +++ stderr 
>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  
>tlsdf.c:15:5: error: use of undeclared identifier 't'
> --
> 2/2/4/1/tasdf.gen(0):
> 
> LOG:  511 external identifiers in one source file     Compilation failed
> ungracefully
> -- 
>2/2/4/1/tiasdf.gen(0)::
> 
> LOG:  8 nesting levels of #include files  Compilation failed
> ungracefully
> --
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...