Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用jq编写批处理文件来查找具有特定属性的json文件并将其复制到新位置_Json_Batch File_Cmd_Jq_Findstr - Fatal编程技术网

如何使用jq编写批处理文件来查找具有特定属性的json文件并将其复制到新位置

如何使用jq编写批处理文件来查找具有特定属性的json文件并将其复制到新位置,json,batch-file,cmd,jq,findstr,Json,Batch File,Cmd,Jq,Findstr,我有100000个带线条的json文件,我需要根据它们是否包含某个属性的特定值进行拆分,然后我需要将它们转换为另一个平台可以读入的有效json 我使用一个批处理文件来实现这一点,并通过以下方式将它们转换为有效的json: for /r %%f in (*.json*) do jq -s -c "." "%%f" >> "C:\Users\me\my-folder\%%~nxf.json" 我只是不知道如何只复制包含特定值的

我有100000个带线条的json文件,我需要根据它们是否包含某个属性的特定值进行拆分,然后我需要将它们转换为另一个平台可以读入的有效json

我使用一个批处理文件来实现这一点,并通过以下方式将它们转换为有效的json:

for /r %%f in (*.json*) do jq -s -c "." "%%f" >> "C:\Users\me\my-folder\%%~nxf.json"
我只是不知道如何只复制包含特定值的文件。因此,逻辑应该是:

Look at all the files in the folders and sub solders
  If the file contains an attribute "event" with a value of "abcd123"
  then: convert the file into valid json and persist it with the same filename over to location "C:\Users\me\my-folder\"
  else: ignore it
应选择的文件示例:

{"name":"bob","event":"abcd123"}
{"name":"ann","event":"778PPP"}

不应选择的文件示例:

{"name":"bob","event":"abcd123"}
{"name":"ann","event":"778PPP"}

希望您能帮我找出过滤部分。

您考虑过使用吗

请打开命令提示窗口,键入
findstr/?
,按ENTER键,然后读取其使用信息。(例如,您可能需要考虑<代码> /i < /Cord>选项)。

然后,您可以在另一个for循环中使用它将这些文件传播到copy命令的变量中

例如:

@For /F "EOL=? Delims=" %%G In (
    '%SystemRoot%\System32\findstr.exe /SRM "\"event\":\"abcd123\"" "C:\Users\me\my-folder\*.json"'
) Do @Copy /Y "%%G" "S:\omewhere Else"
For /F "EOL=? Delims=" %G In ('%SystemRoot%\System32\findstr.exe /SRM "\"event\":\"abcd123\"" "C:\Users\me\my-folder\*.json"') Do @Copy /Y "%G" "S:\omewhere Else"
例如:

@For /F "EOL=? Delims=" %%G In (
    '%SystemRoot%\System32\findstr.exe /SRM "\"event\":\"abcd123\"" "C:\Users\me\my-folder\*.json"'
) Do @Copy /Y "%%G" "S:\omewhere Else"
For /F "EOL=? Delims=" %G In ('%SystemRoot%\System32\findstr.exe /SRM "\"event\":\"abcd123\"" "C:\Users\me\my-folder\*.json"') Do @Copy /Y "%G" "S:\omewhere Else"

由于文件名可能比命令行中的文件名多,因此此响应将假设有必要对文件名进行shell循环,正如问题本身所设想的那样。因为我目前正在使用bash shell,所以我将提供一个bash解决方案,希望它可以很容易地转换为其他shell

问题的复杂性在于输入文件可能包含一个或多个有效的JSON值,或一个或多个逗号分隔的JSON值

使用jq的简单解决方案的关键是jq的-e命令行选项,因为它将返回代码设置为0 if和only if (a) 程序运行正常;(b)最后的结果是真实值

为了清楚起见,让我们将相关的选择标准封装在两个bash函数中:

# If the input is a valid stream of JSON objects
function try {
  jq -e -n 'any( inputs | objects; select( .event == "abcd123") | true)' 2> /dev/null > /dev/null
}


# If the input is a valid JSON array whose elements are to be checked
function try_array {
  jq -e 'any( .[] | objects; select( .event == "abcd123") | true)' 2> /dev/null > /dev/null
}

现在,可以按照以下思路构建一个全面的解决方案:

find . -type f -maxdepth 1 -name '*.json' | while read -r f
do
  < "$f" try
  if [ $? = 0 ] ; then
      echo copy $f
  elif [ $? = 5 ] ; then
      (echo '['; cat "$f"; echo ']') | try_array
      if [ $? = 0 ] ; then
      echo copy $f
      fi
  fi
done
find-键入f-maxdepth 1-name'*.json'|而read-rf
做
<“$f”试试看
如果[$?=0];然后
回音副本$f
elif[$?=5];然后
(echo'[';cat“$f”;echo']')|尝试使用数组
如果[$?=0];然后
回音副本$f
fi
fi
完成

最后一个示例既不是有效的JSON,也不是有效的JSON实体流。请澄清您是否有意这样做,如果是的话,是否可以假定此非JSON流类型的文件为逗号分隔的JSONTANKS,以便返回。中包含两个json对象的最后示例无效。这是真的。这是一个关于文件实际外观的示例(我无法控制)。是的,你可以假设它是逗号分隔的json.Mods,我们可以重新开始这个问题吗。我不太清楚为什么它首先被关闭了?@伊恩-你能考虑投票来重新打开这个问题吗?这个问题似乎已经被关闭了,因为有一个建议的答案。@奥古斯伊斯梅尔-你能考虑投票重新打开这个问题吗?由于其中一个建议的答案,它似乎已经关闭。尽管没有使用
jq
,但无论您的文件是否为有效的JSON,它都可以工作。我刚刚测试了它,它完全按照预期工作。无论是谁否决了该解决方案,都应该知道[]、[]和[]标记都与此答案相关,因此未来的读者或搜索者仍会对一个工作解决方案感兴趣,该解决方案可以复制任何目录及其子目录中的所有文件,其中包含一个精确的
“属性”:“value”
字符串对,无需依赖未作为其操作系统一部分安装的工具。令人惊讶的是,我们将在周末试一试并返回给您!非常感谢!:)