【问题标题】:processing TSV embedded with JSON using jq?使用 jq 处理嵌入 JSON 的 TSV?
【发布时间】:2021-10-11 00:02:31
【问题描述】:
$ jq --slurp '.[] | .a' <<< '{"a": 1}'$'\n''{"a": 2}'
1
2

我可以像上面那样处理单列 TSV 文件。多列且一列是JSON时,如何将JSON列的处理结果与其他列单独打印?下面的例子,如何打印第一列和第二列的JSON处理结果?

$ jq --slurp '.[] | .a' <<< $'A\t{"a": 1}'$'\nB\t{"a": 2}'
parse error: Invalid numeric literal at line 1, column 2

【问题讨论】:

    标签: jq


    【解决方案1】:

    在将您的 TSV 文件传送到 jq 之前,您应该先提取 JSON 列。例如,使用 GNU coreutils 中的 cut 来获取制表符分隔行中的第二个字段:

    cut -f2 <<< $'A\t{"a": 1}'$'\nB\t{"a": 2}' | jq --slurp '.[] | .a'
    

    为了也打印其他列,您可以使用paste 将这些列重新组合在一起:

    paste <(
      cut -f1 <<< $'A\t{"a": 1}'$'\nB\t{"a": 2}'
    ) <(
      cut -f2 <<< $'A\t{"a": 1}'$'\nB\t{"a": 2}' | jq --slurp '.[] | .a'
    )
    

    要在jq 中完全解决这个问题,您必须首先将其作为非 JSON 读取,然后使用 jq 的 fromjson 将第二列解释为 JSON

    jq -Rr './"\t" | .[1] |= (fromjson | .a) | @tsv' <<< $'A\t{"a": 1}'$'\nB\t{"a": 2}'
    

    【讨论】:

    • 我不想重复输入。有没有办法只使用 jq 来处理以 JSON 为列的 TSV 文件?或者,也许在 python 中有一个 jq 的包装器,以便我可以使用 python 来提取 TSV 的列,并且仍然使用 jq 语法来处理提取的 JSON 内容?
    • 在我的回答中添加了一个 jq-only 解决方案。
    • 我在stedolan.github.io/jq/manual 中没有看到./"\t" 的定义。你知道它记录在哪里吗?
    • 在“乘法、除法、模数”部分下:Dividing a string by another splits the first using the second as separators。相当于split("\t")
    • 如何提取两个或多个字段?我试过$ jq -Rr './"\t" | .[1] |= (fromjson | [.a, .b]|@tsv) | @tsv' &lt;&lt;&lt; $'A\t{"a": 1, "b": 2}'。但是\t 没有转换成TAB。
    【解决方案2】:
    jq --raw-input --raw-output --slurp 'split("\n") | map(split("\t")) | map(select(length>0)) | .[] | {"p":.[0], "j":.[1] | fromjson} | [.p, .j.a] | @tsv' <<< $'A\t{"a": 1}'$'\nB\t{"a": 2}'
    
    A   1
    B   2
    

    或逐行处理大数据

    cat ./data.txt | while read line;
    do
        echo "$line" | jq --raw-input --raw-output --slurp 'split("\t") | {"p":.[0], "j":.[1] | fromjson} | [.p, .j.a] | @tsv'
    done
    

    【讨论】:

      猜你喜欢
      • 2021-04-26
      • 1970-01-01
      • 1970-01-01
      • 2019-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多