如何在一个 jq 命令中处理两个字符串?

如何在一个 jq 命令中处理两个字符串?

我试图jq通过模仿答案来在一个命令中处理两个字符串这个问题

但我什至无法完成简单的任务,例如连接两个字符串(存储在 bash 变量中str1str2。我通过调整 SO 答案尝试了以下操作:

jq -s -R '.[0] + .[1]' <(echo "$str1") <(echo "$str2")

但我收到一个错误:

jq:错误(位于/dev/fd/62:1):无法用数字索引字符串

我是jq新手。

有人可以解释一下如何修复上述 jq 用法吗?

(这是 jq 1.6、Ubuntu 18.04 LTS 的情况)。

- 更新 -

只是为了澄清。我的想法更复杂。基本上,我需要解析两个字符串(它们是 CSV),然后合并两个解析后的字符串数组(粗略地说)。但我无法绕过获取输入。

正如评论中正确指出的那样,其他工具可能会更好地处理两个原始字符串。而且我也可以轻松编写程序。但我只是更喜欢 jq 干净的工作流程。

无论如何,真正的问题是上面发布的。但作为一个更具体的例子:

如果我有两个字符串

str1='(a),(c),(b)'
str2='(a),(b)'

我想编写一个jq命令来解析两个数组/集并找出它们的差异。所以预期的输出是

(c)

我知道jq可以进行所有排序、设置差异等(如文档和链接的 SO 问题所示),但我不确定如何将两个输入输入 jq。

答案1

我可以尝试发出以下命令

sed -z 's/\n/,/g;s/,$/\n/' <(comm -3 <(echo "${str1//,/$'\n'}" | sort) <(echo "${str2//,/$'\n'}" | sort))

进行的测试

$ str1='(a),(c),(b),(d)'
$ str2='(a),(b)'
$ sed -z 's/\n/,/g;s/,$/\n/' <(comm -3 <(echo "${str1//,/$'\n'}" | sort) <(echo "${str2//,/$'\n'}" | sort))
(c),(d)

shell参数替换

echo "${str1//,/$'\n'}

用换行符替换逗号。

由于该comm命令需要对值进行排序

echo "${str1//,/$'\n'}" | sort

避免替换最后一行的换行符

sed -z 's/\n/,/g;s/,$/\n/'

注意。-z将分隔符更改为空字符 (\0 )。这可以与它的局限性

相关内容