如何在jq中添加包含或开始

art*_*480 2 unix linux jq

我有以下命令:

echo "column1, column2, column3" > test.csv &&
cat data.json | jq -r '. | [.["column1"], .["column2"], .["column3"]] | @csv’ >> test.csv
Run Code Online (Sandbox Code Playgroud)

它创建一个列标题和来自data.json.

我还尝试添加它,例如它只会"abc"column3.

我添加了|select(.column3| startswith ('ab'))所以完整的命令是:

echo "column1, column2, column3" > test.csv &&
cat data.json | jq -r '. | [.["column1"], .["column2"], .["column3"]] |select(.column3| startswith ('ab')) | @csv’ >> test.csv
Run Code Online (Sandbox Code Playgroud)

但我收到以下错误:

-bash: syntax error near unexpected token `('
Run Code Online (Sandbox Code Playgroud)

我的 json.data 看起来像这样:

-bash: syntax error near unexpected token `('
Run Code Online (Sandbox Code Playgroud)

我如何解析column3?不知道我做错了什么。

Sha*_*awn 5

在将对象转换为数组之前过滤更容易@csv

$ (echo "column1,column2,column3";
   jq -r 'select(.column3 | startswith("ab"))
          | [.column1, .column2, .column3]
          | @csv' data.json) > test.csv
$ cat test.csv
column1,column2,column3
"hello","bye","abc"
Run Code Online (Sandbox Code Playgroud)

但是,如果您确实想先转换为数组,则必须select使用适当的数组索引:

jq -r '[.column1, .column2, .column3]
       | select(.[2] | startswith("ab"))
       | @csv' data.json
Run Code Online (Sandbox Code Playgroud)

请注意我如何将echo和括jq在一组括号中,以便它们都在同一个子shell 中运行,并在其外部重定向输出,而不必重定向两个命令的输出。还摆脱了无用的猫;jq将输入文件名作为参数。即使没有,输入重定向也比cat.