Usando o awk para imprimir colunas contendo vários padrões

3

Eu preciso usar awk para imprimir as colunas que contêm vários padrões. Eu preciso imprimir a coluna # 2, bem como todas as colunas contendo "config" e "service", respectivamente.

Conteúdo do arquivo:

    build 345 java groovy /test:fail.txt /config:launcher.mxres /nickname:prod /service:session 
    auto 4986 java -xmx512 -d64 /test:pass.txt /nickname:deal /service:engine /config:launcher5.mxres
    build 912 binary.exe -f -t /test:code.txt /config:launcher_binary.mxres /service:scanner /nickname:input 

Saída:

    345 /config:launcher.mxres /service:session
    4986 /config:launcher5.mxres /service:engine
    912 /config:launcher_binary.mxres /service:scanner
    
por ekassis 26.01.2017 / 09:34

1 resposta

7

O seguinte script awk passará pelos campos (colunas) de cada linha e procurará os campos /config: e /service: . Quando encontrado, o conteúdo completo desses campos é armazenado em variáveis.

Depois que os campos forem processados, o script gerará os dados no segundo campo junto com os campos encontrados do loop. O processo continua com a próxima linha de entrada.

{
    config = service = "";

    for (i = 3; i <= NF; ++i) {
        if ($i ~ "^/config:") {
            config = $i;
        } else if ($i ~ "^/service:") {
            service = $i;
        }
    }

    print $2, config, service;
}

Este script foi testado e funciona com gawk (% GNUawk), mawk ( awk de Mike) e nawk (% BSDawk).

Executando isso nos dados que você forneceu:

$ awk -f script.awk data
345 /config:launcher.mxres /service:session
4986 /config:launcher5.mxres /service:engine
912 /config:launcher_binary.mxres /service:scanner

Se você quiser uma saída delimitada por tabulação, adicione BEGIN { OFS = "\t" } na parte superior do script.

... ou você poderia passar a saída do script original através de column -t (irá inserir vários espaços se necessário para alinhar colunas):

$ awk -f script.awk data | column -t
345   /config:launcher.mxres         /service:session
4986  /config:launcher5.mxres        /service:engine
912   /config:launcher_binary.mxres  /service:scanner

Como um verso:

$ awk '{ config = service = ""; for (i = 1; i <= NF; ++i) { if ($i ~ "^/config:") { config = $i } else if ($i ~ "^/service:") { service = $i } } print $2, config, service }' data | column -t
    
por 26.01.2017 / 10:23