输出以分号分隔的字符串

问题描述 投票:6回答:3

让我们说我们有这个文件:

{
  "persons": [
    {
      "friends": 4,
      "phoneNumber": 123456,
      "personID": 11111
    },
    {
      "friends": 2057,
      "phoneNumber": 432100,
      "personID": 22222
    },
    {
      "friends": 50,
      "phoneNumber": 147258,
      "personID": 55555
    }
  ]
}

我现在想要提取人1111122222333334444455555的电话号码作为分号分隔的字符串:

123456;432100;;;147258

在跑步的时候

cat persons.txt | jq ".persons[] | select(.personID==<ID>) | .phoneNumber"

一次为每个<ID>并将结果与​​;之后的工作粘合在一起,这非常慢,因为它必须为每个ID(以及我想要提取的其他字段)重新加载文件。

在单个查询中连接它:

 cat persons.txt | jq "(.persons[] | select(.personID==11111) | .phoneNumber), (.persons[] | select(.personID==22222) | .phoneNumber), (.persons[] | select(.personID==33333) | .phoneNumber), (.persons[] | select(.personID==44444) | .phoneNumber), (.persons[] | select(.personID==55555) | .phoneNumber)"

这也有效,但它给出了

123456
432100
147258

所以我不知道哪些字段缺失,以及我必须插入多少;

json bash export-to-csv jq
3个回答
0
投票

不幸的是我无法测试peak's answer是否有效,因为我只有jq 1.5。这是我昨天晚上想出来的:

  • 对于每个分号,添加以下查询 (\";\" as \$a | \$a)
  • 结果命令(摘要): cat persons.txt | jq "(<1's phone number>), (\";\" as \$a | \$a), (<2's phone number>), (\";\" as \$a | \$a), ..."
  • 结果命令(具体): cat persons.txt | jq "(.persons[] | select(.personID==11111) | .phoneNumber), (\";\" as \$a | \$a), (.persons[] | select(.personID==22222) | .phoneNumber), (\";\" as \$a | \$a), (.persons[] | select(.personID==33333) | .phoneNumber), (\";\" as \$a | \$a), (.persons[] | select(.personID==44444) | .phoneNumber), (\";\" as \$a | \$a), (.persons[] | select(.personID==55555) | .phoneNumber)"
  • 结果: 123456 ";" 432100 ";" ";" ";" 147258
  • 删除换行符和"<commandAsAbove> | tr --delete "\n\""
  • 结果: 123456;432100;;;147258

不要误会我的意思,这比峰值的答案要难得多,但它昨天对我有用。


0
投票

没有jq解决方案:

for i in $(seq 11111 11111 55555)
do
  string=$(grep -B1 "$i" persons.txt | head -1 | sed 's/.* \(.*\),/\1/g')
  echo "$string;" >> output
done
cat output | tr -d '\n' | rev | cut -d';' -f2- | rev > tmp && mv tmp output

这个小脚本将产生您想要的结果,如果输入数据变化,您可以快速调整它

cat output
123456;432100;;;147258
© www.soinside.com 2019 - 2024. All rights reserved.