純粋なデータをjsonファイルに変換

純粋なデータをjsonファイルに変換

みんな。私はLinuxに初めてアクセスし、このサイトを読んで多くのことを学びました。私の会計プログラムに問題がありました。データをプレーンテキストからjsonに移動したいと思います。これにより、より良い結果とより柔軟性が得られると信じています。

別のファイルに情報を含むフォルダがあります。ファイルは次のようになります。

20170404
pago
80051442-4
002-001-0080057
310000


310000
si
2017-06-05

この情報を各行が新しいjsonフィールドである新しいファイルにコピーしたいと思います。このような:

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

私はディレクトリ全体を読み、oldfile.jsonという新しいファイルを構築するスクリプトを探しています。

その後、これらの複数のファイルの結果を別の列に表示したいと思います。

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

お時間をいただきありがとうございます。

答え1

私は以下を使用してこの問題を解決します。ジャックツール(適切なJSON解析/操作ツール):

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- 入力全体を1つの長い文字列としてフィルタに渡します。-s--slurp

答え2

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これまでに処理されたファイルのレコード(または行)の数。1最初の行、2番目の行などを操作すると、これが発生します。2

$0変更されていない完全な入力レコード(または行)。

フィールドの名前が同じ場合は、labels[]セクションで配列を定義してから(たとえば)BEGINインデックスとして参照できます(例:)labels[NR]

答え3

パート2の答え - jsonファイルをテーブルに変換する

使用法: ./json_to_table.sh *.json

#!/bin/bash

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

クールな表形式が必要ない場合は、 | column -tセクションを削除できます(下部、次へdone)。これにより、行のフィールドはスペースで区切られ、各フィールドは固有の幅を持ちます。awkたとえば、プログラムの解析には最適ですが、sed人間が読むのには便利ではありません。

メモ:jsonファイルの各レコードの後に​​はコンマが必要です(最後のレコードを除く)。私が言いたいことは:

"field8":"310000", <- here
"field9":"si", <-here
"field10":"2017-06-05" <- not here. Last record without comma.
}

答え4

したがって、最初の部分の最終スクリプトは次のようになります。

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

パート2の最終結果:

#!/bin/bash

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

関心をお寄せいただきありがとうございます。

関連情報