【问题标题】:How to read each cell of a column in csv and take each as input for jq in bash如何读取 csv 中列的每个单元格并将每个单元格作为 bash 中 jq 的输入
【发布时间】:2022-10-24 23:48:47
【问题描述】:

我正在尝试读取 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,其中包含 line、service、comment_1、comment_2、comment_3 的值

我想读取 csv 的每个值并处理 jq 查询中提到 $1 的输入。

【问题讨论】:

  • 请从您的csv 文件和相应的输出中提供一些输入行。
  • 一列的每个单元格都有以下值:101 145 558 339
  • CSV 是一个文本文件;在您的问题中复制/粘贴几行(包括第一行)
  • @Fravadona 请检查开始 line.csv 是否存在
  • 您是否使用文本编辑器打开了 CSV? head -n 4 file.csv 的输出是什么?

标签: bash csv jq


【解决方案1】:
给定输入文件和所需的输出:
  • 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("
") | 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

更新:使用 jq 1.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

【讨论】:

  • 谢谢,这有效 这是在新行中打印所有结果。您能否告诉我如何以 CSV 格式打印结果,使行、服务、comment_1、comment_2 和 comment_3 连续出现但不同的列?
  • 查看更新的答案
  • 如果 line.csv 有第二列,其值对应于第一列。我们如何也打印第二列值?例如,B1 具有与 A1 相关的值。因此,在打印 .scan.line、.scan.service... 时,它还会为特定的 A 列值打印 B 列
  • 我不确定你的意思;您应该使用line.csv 的样本(例如命令head -n 3 line.csv 的原始输出)、linescan.json 的样本以及这两个输入样本的确切输出来问另一个问题。
  • line.csv 22,Test1 3389,Test2 10,Test3 JSON:{“scan”:{“line”:3389,“service”:“Linetest”,“comment_1”:“线路已测试”,“comment_2”:“线路已测试" } } 输出:Test2 |第3389章线测试 |线路测试 |线路经过测试
猜你喜欢
  • 2015-10-06
  • 1970-01-01
  • 1970-01-01
  • 2019-04-21
  • 1970-01-01
  • 1970-01-01
  • 2021-05-29
相关资源
最近更新 更多