下面是for循环的片段,我对txt文件名进行排序。然后我尝试将结果保存在json格式文件中。然而,它导致json格式不是所希望的。我如何将for循环中的值转换为所需的json格式?
dir="myfiles/test/"
prefix=""
echo "[" >> test.json
for dir in "${array[@]}"; do
#reverse the result of comparisons
file=$(find "$dir" -maxdepth 1 -type f -iname '*.txt' | awk "NR==$i")
[[ -n $file ]] &&
printf '%b{ "filepath": "%s" }' $prefix "$file" >> test.json
prefix=",\n"
done
echo
echo "]" >> test.json
当前输出
[
{ "filepath" : "myfiles/test/sdfsd.txt" },
{ "filepath" : "myfiles/test/piids.txt" },
{ "filepath" : "myfiles/test/saaad.txt" },
{ "filepath" : "myfiles/test/smmnu.txt" },
]
期望的输出
[
[
{ "filepath" : "myfiles/test/sdfsd.txt" }
],
[
{ "filepath" : "myfiles/test/piids.txt" }
],
[
{ "filepath" : "myfiles/test/saaad.txt" }
],
[
{ "filepath" : "myfiles/test/smmnu.txt" }
]
]
也允许
[
[
{ "filepath" : "myfiles/test/sdfsd.txt" },
{ "filepath" : "myfiles/test/sdfsd2.txt" }
],
[
{ "filepath" : "myfiles/test/piids.txt" },
{ "filepath" : "myfiles/test/piids2.txt" }
],
[
{ "filepath" : "myfiles/test/saaad.txt" }
],
[
{ "filepath" : "myfiles/test/smmnu.txt" }
]
]
答案 0 :(得分:2)
使用jq
结合awk来实现您的目标。首先,我们在语法上将不需要的输出转换为正确的格式。然后我们使用jq
格式化它。
我们使用以下awk
脚本:
{
# extract names of files (to see if they are equal
# besides a numerical suffix).
name1 = line
name2 = $0
sub(/"[^"]*$/, "", name1)
sub(/"[^"]*$/, "", name2)
sub(/.*\//, "", name1)
sub(/.*\//, "", name2)
sub(/\....$/, "", name1)
sub(/\....$/, "", name2)
sub(/[0-9]*$/, "", name1)
sub(/[0-9]*$/, "", name2)
# add array symbols to the line
# if last item was closed by a ']' add '[' to beginning
if (closed)
sub(/{/, "[{", line)
# if names are equal, same array
if (name1 != name2) {
sub(/},/, "}],", line)
closed = 1
} else
closed = ""
# if last line, consisting of simply a '['
if ($0 ~ /^]$/)
# remove extra comma at end of line
sub(/,$/, "", line)
# if line is set, print line
if (line)
print line
# set current line to line variable
line = $0
}
这会产生格式错误的输出:
$ cat file
[
{ "filepath" : "myfiles/test/sdfsd.txt" },
{ "filepath" : "myfiles/test/piids.txt" },
{ "filepath" : "myfiles/test/saaad.txt" },
{ "filepath" : "myfiles/test/smmnu.txt" },
]
$ awk -f script.awk file
[
[{ "filepath" : "myfiles/test/sdfsd.txt" }],
[{ "filepath" : "myfiles/test/piids.txt" }],
[{ "filepath" : "myfiles/test/saaad.txt" }],
[{ "filepath" : "myfiles/test/smmnu.txt" }]
]
我们现在可以使用jq
格式化:
$ awk -f script.awk file | jq .
[
[
{
"filepath": "myfiles/test/sdfsd.txt"
}
],
[
{
"filepath": "myfiles/test/piids.txt"
}
],
[
{
"filepath": "myfiles/test/saaad.txt"
}
],
[
{
"filepath": "myfiles/test/smmnu.txt"
}
]
]
请注意,这样可以处理几乎完全相同的文件,因为它们只在数字后缀中有所不同。例如:
$ cat file
[
{ "filepath" : "myfiles/test/sdfsd.txt" },
{ "filepath" : "myfiles/test/sdfsd2.txt" },
{ "filepath" : "myfiles/test/piids.txt" },
{ "filepath" : "myfiles/test/saaad.txt" },
{ "filepath" : "myfiles/test/smmnu.txt" },
]
$ awk -f script.awk file | jq .
[
[
{
"filepath": "myfiles/test/sdfsd.txt"
},
{
"filepath": "myfiles/test/sdfsd2.txt"
}
],
[
{
"filepath": "myfiles/test/piids.txt"
}
],
[
{
"filepath": "myfiles/test/saaad.txt"
}
],
[
{
"filepath": "myfiles/test/smmnu.txt"
}
]
]
答案 1 :(得分:0)
对于第一部分,将当前输出保存到test.json
,然后执行:
cat test.json | sed 's,{,[\n{,g;s;},;}\n],;g' > tmp ; mv tmp test.json
更短的方法是:
sed -i 's,{,[\n{,g;s;},;}\n],;g' test.json
请注意,这仍会在最后一个条目中添加逗号,并且不会格式化输出,因此结果仍然无效json。