【问题标题】:Nested while loop with input from main while in shell script在 shell 脚本中使用来自 main while 的输入的嵌套 while 循环
【发布时间】:2023-03-18 21:05:02
【问题描述】:

我有 Json 文件,我正在尝试使用下面的方法解析它

#!/bin/ksh
while read rec
 do
    while read line
    do
        firstname=`echo $line | sed -n -e 's/^.*\(full-name\)/\1/p' | cut -f3 -d'"'`
        id=`echo $line | sed -n -e 's/^.*\(id\)/\1/p' | cut -f3 -d'"'`
        echo "${firstname}'|'${id}"
        done < `echo $rec | nawk 'gsub("}}}}", "\n")' | sed 's/{"results"//g'`

done < /var/tmp/Cloud_test.txt

我的示例文件是:

{"results":[{"general-info":{"full-name":"TELOS MANAGEMENT","body":{"party":{"xrefs":{"xref":[{" id":"66666"}]}}}},"_id":"91002551"},{"_id":"222222","body":{"party":{"general-info":{"full -name":"DO REUSE"},"xrefs":{"xref":[{"id":"777777"}]}}}}]}

预期结果:
电信管理|66666
重复使用|777777

我在传递参数时遇到内部问题。它没有逐行通过。它通过的完整线路和结果没有按预期进行。请帮助修复它。

【问题讨论】:

标签: json shell while-loop nested-loops do-while


【解决方案1】:

这是this question 的更复杂(双重)案例。

以下对我有用:

cat sample.json | sed -e 's/"full-name"/\n&/g' | tail -n+2 | sed -e 's/"full-name":"\([^"]*\).*{"id":"\([^"]*\).*/\1\|\2/'

【讨论】:

  • tail -n+2 对我不起作用。你能确认一下这有什么问题吗?
  • 您可以将tail -n+2 替换为grep -v '{"results":',或者查看tail 的手册页。
【解决方案2】:

正如@l0b0 所指出的,此类问题最好使用jq 等可识别JSON 的工具来解决。那么,这里是一个 jq 解决方案。

但必须指出,样本输入异常不规则,因此要求并不那么明确。如果 JSON 更规则,jq 解决方案会更简单。

在任何情况下,下面的 jq 过滤器都会产生所描述的结果:

.results[]
| ..
| objects
| select(has("general-info"))
| [(.["general-info"]|.["full-name"]), (.. | .id? // empty)]
| join("|")

简化

上面的倒数第二行可以简化为:

[."general-info"."full-name", (.. | .id? // empty)]

【讨论】:

  • 没错。文件的顺序不同。这就是问题所在。我们听说 json 可以 out sequnce {"results": [{"general-info":{"full-name":"TELOS MANAGEMENT","body":{"party":{"xrefs":{"外部参照":[{"id":"66666"}]}}}},"_id":"91002551"}, {"_id":"222222","body":{"party":{"general- info":{"full-name":"DO REUSE"},"xrefs":{"xref":[{"id":"777777"}]}}}}, {"_id":"333333", "body":{"party":{"general-info":{"full-name":"AAAA MANAGEMENT"},"xrefs":{"xref":[{"id":"888888"}]} }}},]}
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-20
相关资源
最近更新 更多