Transforma dados simples em arquivo json

1

todos. Eu sou muito novo com o Linux e estou aprendendo muito com todos vocês lendo este site. Estou com um pouco de dificuldade com o meu programa de contabilidade e é por isso que estou recorrendo a você. Eu quero mover meus dados de texto simples para json, o que acredito que me dará melhores resultados e mais flexibilidade.

Eu tenho uma pasta contendo informações em arquivos separados. Os arquivos são assim:

20170404
pago
80051442-4
002-001-0080057
310000


310000
si
2017-06-05

Eu quero copiar esta informação em novos arquivos, onde cada linha é um novo campo json. Algo parecido com isto:

{
"field1":"20170404",
"field2":"pago",
"field3":"80051442-4",
"field4":"002-001-0080057",
"field5":"310000"
"field6":"",
"field7":"";
"field8":"310000"
"field9":"si"
"field10":"2017-06-05"
}

Estou procurando um script para ler todo o diretório e criar esses novos arquivos: oldfile.json.

Depois disso, quero exibir os resultados de vários desses arquivos em colunas diferentes:

file1    field1    field2    field3   field4    field5    field6    field7
file2    field1    field2    field3   field4    field5    field6    field7
file3    field1    field2    field3   field4    field5    field6    field7
file4    field1    field2    field3   field4    field5    field6    field7
file5    field1    field2    field3   field4    field5    field6    field7

Obrigado a todos pelo seu tempo.

    
por José A. González 08.06.2017 / 19:56

4 respostas

1

Responda à segunda parte - convertendo os arquivos json para a tabela.

Uso: ./json_to_table.sh *.json

#!/bin/bash

for i in "$@"; do
    file_content=$(sed -n 's/".*":"\(.*\)",\?//p' "$i" | tr '\n' ' ')
    printf "%s %s\n" "$i" "$file_content"
done | column -t

Se você não precisa de um formato de tabela bonito, você pode remover | column -t part (na parte inferior, depois de done ). Em seguida, os campos da linha serão separados por um espaço, portanto, cada um terá sua própria largura. É bom para análise por programas, como awk , sed , mas inconveniente para a leitura humana.

Observação: após cada registro no arquivo json, exceto último, deve ser vírgula. O que quero dizer:

"field8":"310000", <- here
"field9":"si", <-here
"field10":"2017-06-05" <- not here. Last record without comma.
}
    
por 10.06.2017 / 00:31
5

Eu resolveria isso usando a ferramenta jq ( uma ferramenta de análise / manipulação JSON adequada):

for f in *; do
    jq -R -s 'rtrimstr("\n") | split("\n") | to_entries | reduce .[] as $o ({}; .["field" + ($o.key+1|tostring)] |= $o.value )' "$f" > "$f".json; 
done
  • -R ( --raw-input ) combinado com -s ( --slurp ) - passa a entrada inteira para o filtro como uma única string longa
por 09.06.2017 / 12:16
1
for file in *; do
    awk 'BEGIN { print "{" }  END { print "\n}" } { printf( "%s",newrec); printf( "\"field%d\": \"%s\"", NR, $0); newrec=",\n" }' "$file" > "${file}.json"
done

NR é o Número de Registros (ou linhas) no arquivo que foi processado até o momento. É 1 ao trabalhar na linha um, 2 na linha dois e assim por diante.

$0 é o registro de entrada inteiro não modificado (ou linha).

Se os nomes dos campos forem os mesmos, você pode definir uma matriz (por exemplo, labels[] ) na sub-rotina BEGIN e, em seguida, referenciá-los por índice (por exemplo, labels[NR] ).

    
por 08.06.2017 / 20:51
0

Portanto, o roteiro final da primeira parte é:

for file in facturas/*; do
    awk 'BEGIN {
        split("fechae tpago ruc nfactura total iva10 iva5 iva0 archivado fechap",campos)
        print "{" 
    }
    END {
        print "\n}" 
    }
    {
        printf( "%s",newrec)
        printf( "\"%s\":\"%s\"", campos[NR], $0)
        newrec=",\n"
    }' "$file" > "${file}.json"
done

E o resultado final da segunda parte:

#!/bin/bash

for i in "$@"; do
    printf "%s " "$i"
    sed -n 's/".*":"\(.*\)"//p' "$i" | tr ',\n' ' ' 
    echo
done | column -t

Obrigado a todos pelo seu interesse.

    
por 09.06.2017 / 23:59