使用 JQ 构建目录树的 JSON
Posted
技术标签:
【中文标题】使用 JQ 构建目录树的 JSON【英文标题】:Building a JSON of a directory tree using JQ 【发布时间】:2018-09-26 18:03:28 【问题描述】:我正在尝试使用jq 构建目录树的 JSON。我已经完成了一半,但是目录树是扁平的,我需要将每个目录放入它的父级 children
数组中。
我目前的代码是dirtree.jq
:
[
split("\n\n") as $list
| $list
| .[0]
| split("\n")
| . + [ .[0] | split("\\") | .[0:-1] | join("\\") ] # add root folder
| sort
| . as $folders
| $list
| .[1]
| split("\n") as $files
| $folders [] as $parent
|
path: $parent,
children: (
$files
| map(
path: select(
. | (split("\\") | .[0:-1] | join("\\")) as $fileParent # get parent path
| $fileParent == $parent
)
)
)
] as $flatTree
| $flatTree
input 文件是格式列表中的原始纯文本文件:
首先是给定文件夹的所有目录
然后空行
然后列出所有文件:
C:\Program Files\7-Zip
C:\Program Files\ASUS
C:\Program Files\Common Files
C:\Program Files\Intel
C:\Program Files\Internet Explorer
C:\Program Files\Mozilla Firefox
C:\Program Files\MSBuild
C:\Program Files\NVIDIA Corporation
C:\Program Files\Realtek
.
.
.
C:\Program Files\WindowsPowerShell\Modules\PowerShellGet\1.0.0.1\en-US
C:\Program Files\WindowsPowerShell\Modules\PSReadline\1.2
C:\Program Files\WindowsPowerShell\Modules\PSReadline\1.2\en
<-- NOTE THIS EMPTY LINE (\n\n) that separates folders from files
C:\Program Files\desktop.ini
C:\Program Files\7-Zip\7-zip.chm
C:\Program Files\7-Zip\7-zip.dll
C:\Program Files\7-Zip\7-zip32.dll
C:\Program Files\7-Zip\7z.dll
C:\Program Files\7-Zip\7z.exe
C:\Program Files\7-Zip\7z.sfx
C:\Program Files\7-Zip\7zCon.sfx
C:\Program Files\7-Zip\7zFM.exe
C:\Program Files\7-Zip\7zG.exe
C:\Program Files\7-Zip\descript.ion
.
.
.
C:\Program Files\WindowsPowerShell\Modules\PSReadline\1.2\Microsoft.PowerShell.PSReadline.dll
C:\Program Files\WindowsPowerShell\Modules\PSReadline\1.2\PSReadline.psd1
C:\Program Files\WindowsPowerShell\Modules\PSReadline\1.2\PSReadline.psm1
C:\Program Files\WindowsPowerShell\Modules\PSReadline\1.2\en\Microsoft.PowerShell.PSReadline.Resources.dll
resulting json 已将所有文件添加到各自的父级,但现在我需要将每个文件夹移动到 parent
的 children
数组中:
命令行:
jq -R --slurp -s -f dirtree.jq input.txt > dirtree.json
【问题讨论】:
【参考方案1】:以下内容可能不是您想要的,但应该可以帮助您:
def parsePathname: split("\\") | path: .[0:length-1], file: .[-1];
# skip over lines that only specify directories
def pathnames:
foreach inputs as $x (null;
if . == null
then if ($x|length) == 0 then 0 else . end
else .+1
end;
select(. and . > 0)|$x)
| parsePathname ;
reduce pathnames as $pn (;
getpath($pn.path + ["children"]) as $children
| setpath($pn.path + ["children"]; $children + [$pn.file]) )
输出
在您的列表修剪指示性行后,运行以下命令:
jq -R -n -f dirtree.jq dirtree.txt
产生:
"C:":
"Program Files":
"children": [
"desktop.ini"
],
"7-Zip":
"children": [
"7-zip.chm",
"7-zip.dll",
"7-zip32.dll",
"7z.dll",
"7z.exe",
"7z.sfx",
"7zCon.sfx",
"7zFM.exe",
"7zG.exe",
"descript.ion"
]
,
"WindowsPowerShell":
"Modules":
"PSReadline":
"1.2":
"children": [
"Microsoft.PowerShell.PSReadline.dll",
"PSReadline.psd1",
"PSReadline.psm1"
],
"en":
"children": [
"Microsoft.PowerShell.PSReadline.Resources.dll"
]
【讨论】:
以上是关于使用 JQ 构建目录树的 JSON的主要内容,如果未能解决你的问题,请参考以下文章
决策树(Decision Tree)决策树的构建决策树流程树的生长熵信息增益比基尼系数
R语言使用party包中的ctree函数构建条件推理决策树的流程和步骤条件推理决策树是传统决策树的一个重要变体条件推理树的分裂是基于显著性测试而不是熵/纯度/同质性度量来选择分裂