1

起初,我使用jshonJSON解析了一个带有循环的数组文件,但耗时太长。

为了加快速度,我想我可以id从每个索引返回每个值,用word另一种类型重复,将它们放入变量中,最后在回显之前将它们连接在一起。我使用 对文件做了类似的事情paste,但我收到一个错误,抱怨输入太长。

如果有一种更有效的方法可以在bash没有太多依赖项的情况下执行此操作,请告诉我。

我忘了提到我希望有可能独立地为不同的部分着色(红色id)。另外,我不存储 json;它是管道的:

 URL="http://somewebsitewithanapi.tld?foo=no&bar=yes"
 API=`curl -s "$URL"`
  id=`echo $API | jshon -a -e id -u`
word=`echo $API | jshon -a -e word -u | sed 's/bar/foo/'`

red='\e[0;31m'       blue='\e[0;34`m'  #bash colors
echo "${red}$id${x}. ${blue}$word${x}" #SOMEHOW CONCATENATED SIDE-BY-SIDE,
# PRESERVING THE ABILITY TO COLORIZE THEM INDEPENDENTLY.

我的输入(管道;不是文件):

[
  {
    "id": 1,
    "word": "wordA"
  },
  {
    "id": 2,
    "word": "wordB"
  },
  {
    "id": 3,
    "word": "wordC"
  }
]

试过:

jshon -a -e id -u :

这会产生:

1
2
3

和:

jshon -a -e text -u :

这会产生:

wordA
wordB
wordC

加入后的预期结果:

1 wordA
2 wordB
3 wordC
4 wordD
4

3 回答 3

2

您可以使用解析器jq

jq '.[] | "\(.id) \(.word)"' jsonfile

它产生:

"1 wordA"
"2 wordB"
"3 wordC"

如果您想摆脱双引号,请将输出通过管道传输到

jq '.[] | "\(.id) \(.word)"' jsonfile | sed -e 's/^.\(.*\).$/\1/'

这会产生:

1 wordA
2 wordB
3 wordC

更新:请参阅Martin Neal 的sed评论,了解无需其他命令即可删除引号的解决方案。

于 2013-11-02T20:45:16.457 回答
2

您正在考虑的粘贴解决方案是这样的:

paste <(jshon -a -e id -u < foo.json) <(jshon -a -e word -u < foo.json)

当然,您正在处理文件两次。您还可以使用带有 JSON 库的语言,例如 ruby​​:

ruby -rjson -le '
  JSON.parse(File.read(ARGV.shift)).each {|h| print h["id"], " ", h["word"]}
' foo.json
1 wordA
2 wordB
3 wordC

API=$(curl -s "$URL")
# store ids and words in arrays
id=(   $(jshon -a -e id -u <<< "$API") )
word=( $(jshon -a -e word -u <<< "$API" | sed 's/bar/foo/') )

red='\e[0;31m';
blue='\e[0;34m'
x='\e[0m'

for (( i=0; i<${#id[@]}; i++ )); do
    printf "%s%s%s %s%s%s\n" "$red"  "${id[i]}"   "$x" \
                             "$blue" "${word[i]}" "$x"
done
于 2013-11-02T20:54:36.963 回答
1

我会选择 Birei 的解决方案,但如果您的输出受到样本行的限制,则以下可能有效(使用 GNU grep)

paste -d ' ' <(grep -oP '(?<=id": ).*(?=,)' file.txt) \
   <(grep -oP '(?<=word": ").*(?=",)' file.txt)
于 2013-11-02T20:48:42.280 回答