
みんな。私は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
関心をお寄せいただきありがとうございます。