在shell脚本中获取逗号分隔值

Posted

技术标签:

【中文标题】在shell脚本中获取逗号分隔值【英文标题】:Get comma separated values in shell script 【发布时间】:2018-11-09 21:49:28 【问题描述】:

我有一个包含多行的文件,如以下字符串。我需要提取 id 和 obj 的值。

"Class":"ZONE","id":"DEV100.ZN301","name":"3109 E BTM","zgroup":"EAST FLOOR 3","prog":"","members":["obj":"DEV300.WC3","obj":"DEV300.WC4","obj":"DEV300.WC7","obj":"DEV300.WC10"]

我正在使用以下命令来获取输出:

[user@server ~]$ cat file.txt | grep "\"Class\":\"ZONE\"" | while IFS="," read -r a b c d e f ; do echo "$b$f";done | grep ZN301

输出:

"id":"DEV100.ZN301""members":["obj":"DEV300.WC3","obj":"DEV300.WC4","obj":"DEV300.WC7","obj":"DEV300.WC10"]

我的目标是获得以下输出:

DEV100.ZN301 : DEV300.WC3 , DEV300.WC4 , DEV300.WC7 , DEV300.WC10

请帮帮我。谢谢!

【问题讨论】:

明智的做法是使用jq。尝试使用不理解其语法的工具解析 JSON 天生就容易出错。 请记住,如果生成文件的程序突然启动,比如对键进行排序,以使行看起来像 "Class":"ZONE","id":"DEV100.ZN301","members":["obj":"DEV300.WC3","obj":"DEV300.WC4","obj":"DEV300.WC7","obj":"DEV300.WC10"],"name":"3109 E BTM","prog":"","zgroup":"EAST FLOOR 3",那么对于任何兼容的 JSON 解析器来说,这将具有完全相同的语义,但会破坏完全依赖于排序的代码。而这种事情可能发生在库版本更改而工具本身根本没有代码更新的情况下。 【参考方案1】:
jq -r 'select(.Class == "ZONE") | (.id + " : " + ([.members[] | .obj] | join(" , ")))'

...或者,依靠 Python 解释器:

parse_json() 
  python -c '
import sys, json
for line in sys.stdin:
  line = line.strip()    # ignore trailing newlines
  if not line: continue  # skip blank lines
  doc = json.loads(line)
  if doc.get("Class") != "ZONE":
    continue
  line_id = doc.get("id")
  objs = [m.get("obj") for m in doc.get("members", [])]
  sys.stdout.write("%s : %s\n" % (line_id, " , ".join(objs)))
'


parse_json 

【讨论】:

感谢 Charles 的回答,但我无法在机器上安装自定义软件包,而且我有 1000 台这样的机器。所以我正在尝试获得一个可以帮助我的 shell 命令。

以上是关于在shell脚本中获取逗号分隔值的主要内容,如果未能解决你的问题,请参考以下文章

用逗号和等号分隔的Shell脚本解析文本文件

为 PERL 脚本构建 CLI 参数的 Shell 脚本

用于在文件中添加数据的 shell 脚本 [重复]

shell脚本的空格分隔参数

python调用shell脚本 获取shell脚本中间的输出值

shell脚本获取MD5值