每个人。我对 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
结合- 将整个输入作为单个长字符串传递到过滤器-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
$0
是整个未修改的输入记录(或行)。
如果字段的名称相同,您可以labels[]
在节中定义一个数组(例如 )BEGIN
,然后通过索引引用它们(例如labels[NR]
)。
答案3
回答第二部分 - 将 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
第二部分的最终结果:
#!/bin/bash
for i in "$@"; do
printf "%s " "$i"
sed -n 's/".*":"\(.*\)"/\1/p' "$i" | tr ',\n' ' '
echo
done | column -t
感谢大家的关注。