jq único comando gravar em arquivos diferentes

1

Eu tenho um arquivo de log JSON test.log :

{"type":"1","fname":"AAA","lname":"bbb" }    
{"type":"2","state":"gujarat" }     
{"type":"3","city":"ahmedabad" }    
{"type":"3","city":"rajkot" }   
{"type":"1","fname":"ccc","lname":"ddd" }    

Eu corro os seguintes comandos

cat test.log | jq -c "select(.type==\"1\")|{fname:.fname}" > type_1.txt     
cat test.log | jq -c "select(.type==\"3\")|{city:.city}" > type_3.txt   

É possível que um único comando jq gere vários arquivos de saída?

Eu quero executar o comando jq apenas uma vez no arquivo test.log e gerar um arquivo de saída para cada tipo de item.

    
por vimal 01.03.2015 / 18:02

3 respostas

1

De acordo com a seção IO do manual da versão 1.5 jq só pode gravar na saída padrão e imprimir mensagens de depuração para stderr .

O que você poderia fazer se não quiser executar o jq em test.log várias vezes, por exemplo, porque é um arquivo grande, é

jq -c '(select(.type=="1") | {fname:.fname}), (select(.type=="3") | {city:.city})' test.log > temp
# The file 'temp' contains one entry per line.
grep '^{"fname"' temp > type_1.txt
grep '^{"city"' temp > type_3.txt   
rm temp
    
por 28.10.2015 / 21:00
1

Pode ser mais fácil usar uma linguagem completa aqui. Como:

perl -MJSON -ne '
  BEGIN{$j = JSON->new}
  $j->incr_parse($_);
  END{
    for $i ($j->incr_parse) {
      $t = delete($i->{type});
      $out{$t} .= to_json($i) . "\n";
    }
    for $t (keys %out) {
      open OUT, ">", "type_$t.json" or die "type_$t.json: $!\n";
      print OUT $out{$t};
    }
  }' < input.json
    
por 11.06.2018 / 20:48
0

jq apenas grava em stdout (ou stderr), portanto, você precisa de outro programa para dividir o fluxo em diferentes arquivos de log. Primeiro, você enriquece o comando js de @nwk com um campo de arquivo de log.

jq -c '(select(.type=="1") | {"logfile":.type},{fname:.fname}),
       (select(.type=="3") | {"logfile":.type},{city:.city})' test.log

Você pode canalizar essa saída para awk , que pode pegar os nomes dos arquivos

jq -c '(select(.type=="1") | {"logfile":.type},{fname:.fname}),
       (select(.type=="3") | {"logfile":.type},{city:.city})' test.log |
       awk -F"\"" 'BEGIN {FPAT="[^{}:\"]+" } 
            $1=="logfile" {lf="type_"$2".txt"; next}
            {print >> lf}'
    
por 07.06.2018 / 16:21