Awk e Grep para obter dados da CLI

0

Eu quero obter a saída como abaixo:

Number      Name         Value
*************************************
889900     Staff         256000
990088     Staff         1048576

E minha entrada seria como abaixo:

%%LST:="889900";%%


Actual                            Service                           Key                              Value 
Staff                             00000001                          350                               256000        
company                           00000002                          360                               1572864       

Total count = 2

There is together 1 report


%%LST:="990088";%%


Actual                            Service                           Key                               Value 
Staff                             00000003                          350                               1048576       
plusmines                         00000004                          120                               20480         
different                         1001                              201                               5120          

Total count = 3

There is together 1 report


%%LST:="112233";%%


Actual                            Service                           Key                               Value 
additional                        00000005                          320                               1048576       
payitoff                          20001                             73710                             1048576       
clubonetwothree                   00000006                          90006280                          1048576       

Total count = 3

There is together 1 report

Eu fiz abaixo da codificação:

IFS=$'\n'
cat > initial
cat initial | grep "%%LST:=" | awk -F'"' '{print$2}' > x1
cat initial | awk -F' ' '{if ($3 == 350) print $1,$4; else echo "0"}' > x2
rm results2
echo -e "Number       Name                      Value\n*************************************" >> results2
paste x1      x2 | sort -n | expand -t 13 >> results2
cat results2; 
rm initial

O que eu quero é obter "Number" do "%%LST:=" na entrada e do nome se "Key" for igual = 350 e "Value" for o valor correspondente de "Key" saída.

Atualmente, minha codificação está apenas obtendo todos os "Number" e cole-os em uma lista, junto com as informações obtidas de "Key" e "Value" .

O problema é que, se meu registro não tiver "Key" = 350 , ele não pula nem deixa um espaço vazio. Meu resultado final todo está indo errado.

Qual função posso usar para listar apenas as informações relacionadas que têm "Key = 350" ?

    
por remy 29.03.2016 / 09:18

1 resposta

1
#! /usr/bin/awk -f

BEGIN {
    OFS="\t";
    print "Number","Name","Value";
    print "*************************************";
    number="" ; name="" ; value="";
};

/^%%LST/ {
    if (number != "" && name != "" && value != "") { 
        print number, name, value;
        name=""; value="";
    } ;
    number=gensub(/%%LST:=?"([0-9]+)";%%/,"\1","g") 
} ;

$3 == 350 { 
   name=$1;
   value=$4
};

END {
    if (name != "") {
        print number, name, value
    }
}

Salve como, por exemplo, remy.awk , torne-o executável com chmod +x remy.awk e forneça dados sobre stdin ou um nome de arquivo (por exemplo, ./remy.awk remy.txt )

A seção BEGIN {} configura o OFS (Output Field Separator) como uma guia, depois imprime os cabeçalhos de saída e inicializa as variáveis number , name e value .

Em seguida, ele extrai o número (em uma variável chamada number ) das linhas que começam com '%% LST', mas primeiro verifica se number não estava vazio - se já tiver um valor, ele imprime detalhes do registro anterior e limpa as variáveis name e value .

Nas linhas em que a chave (campo 3) é igual a 350, ela extrai o name e value da linha.

Finalmente, o bloco END {} imprime as variáveis se name não estiver vazia, para que funcione corretamente se o registro final (delimitado por %% linhas LST) for um com Key == 350. Sem isso, não seria possível imprimir os dados do registro final.

A saída, dados seus dados de amostra acima, é:

$ ./remy.awk remy.txt 
Number  Name    Value
*************************************
889900  Staff   256000
990088  Staff   1048576
    
por 29.03.2016 / 09:58

Tags