如何读取csv中列的每个单元格,并将每个单元格作为bash中jq的输入

n1bvdmb6  于 2022-12-06  发布在  其他
关注(0)|答案(1)|浏览(112)

我尝试读取CSV的每个单元格,并将其作为JQ命令的输入。下面是我的代码:

行.csv

| Line |
|:---- |
| 11   |
| 22   |
| 33   |

读取CSV的代码:

while read line

do

   echo "Line is : $line"

done < line.csv

输出量:

Line is 11
Line is 22

jq命令

jq 'select(.scan.line == '"$1"') | .scan.line,"|", .scan.service,"|", .scan.comment_1,"|", .scan.comment_2,"|", .scan.comment_3' linescan.json | xargs

我有一个linescan.json,其中包含行、服务、注解1、注解2和注解3的值
我想读取csv的每个值,并处理jq查询中提到$1的输入。

pcww981p

pcww981p1#

给定输入文件和所需输出:
  • line.csv
22,Test1
3389,Test2
10,Test3
  • linescan.json
{
  "scan": {
    "line": 3389,
    "service": "Linetest",
    "comment_1": "Line is tested1",
    "comment_2": "Line is tested2",
    "comment_3": "Line is tested3"
  }
}
  • 所需输出:
Test2 | 3389 | Linetest | Line is tested1 | Line is tested2 | Line is tested3
以下是jq的解决方案:

这是一个未知的猜测,因为您没有指定输出应该是什么样子:

jq -sr --rawfile lineArr line.csv '
    (
        $lineArr | split("\n") | del(.[-1]) | .[] | split(",")
    ) as [$lineNum,$prefix] |
    .[] | select(.scan.line == ($lineNum | tonumber)) |
    [
        $prefix,
        .scan.line,
        .scan.service,
        .scan.comment_1,
        .scan.comment_2,
        .scan.comment_3
    ] |
    join(" | ")
' linescan.json
更新:对于JQ1.5:
#!/bin/bash

jq -sr --slurpfile lineArr <(jq -R 'split(",")' line.csv) '
    ($lineArr | .[]) as [$lineNum,$prefix] |
    .[] | select(.scan.line == ($lineNum | tonumber)) |
    [
        $prefix,
        (.scan.line | tostring),
        .scan.service,
        .scan.comment_1,
        .scan.comment_2,
        .scan.comment_3
    ] |
    join(" | ")
' linescan.json

相关问题