我有一个包含许多json记录的文本文件,其格式与以下类似:
{"foo":"1","bar":"2","baz":"1","fu":"1"}
{"foo":"3","bar":"2","baz":"4","fu":"2","barf":"1"}
{"foo":"2","bar":"4","baz":"5","fu":"3"}
{"foo":"5","blerg":"1","bar":"6","baz":"6","fu":"7"}
如何使用标准的unix命令行工具来过滤掉多个不相邻的字段?
实施例。说我想只选择bar和fu,我希望我的输出看起来像:
"bar":"2" "fu":"1"
......或者其他类似的东西。谢谢!
答案 0 :(得分:2)
使用sed
,您可以执行此操作:
$ sed -r 's/.*("bar":"\w*").*("fu":"\w*").*/\1 \2/' file
"bar":"2" "fu":"1"
"bar":"2" "fu":"2"
"bar":"4" "fu":"3"
"bar":"6" "fu":"7"
如您所见,.*("bar":"\w*").*("fu":"\w*").*
抓住了"bar": "value"
和"fu": "value"
的块,并使用\1
和\2
将其打印回来。
答案 1 :(得分:2)
awk
awk -F"[{},]" '{print $3,$5}' file
"bar":"2" "fu":"1"
"bar":"2" "fu":"2"
"bar":"4" "fu":"3"
"bar":"6" "fu":"7"
支持随机字段的awk
:
awk -F, '{gsub(/[{}]/,x);for (i=1;i<=NF;i++) if ($i~/"foo"|"bar"/) printf "%s ",$i;print ""}' file
"foo":"1" "bar":"2"
"foo":"3" "bar":"2"
"foo":"2" "bar":"4"
"foo":"5" "bar":"6"
答案 2 :(得分:1)
如果json格式已修复,您可以使用sed
和cut
过滤掉特定列。例如,如果要过滤掉第2列和第4列,可以运行:
$ cat output.txt | sed s/[{}]//g | cut -d, -f2,4 | sed s/,/" "/g
如果您想要更灵活,可以使用 正确的 正则表达式运行`sed或编写python脚本,这将非常简单。
更新:感谢您指出潜在的性能问题。无论如何,我投票支持awk
解决方案。
$ sed s/[{}]//g output.txt | cut -d, -f2,4 | sed s/,/" "/g
答案 3 :(得分:1)
Fur未来,我认为像json命令行工具这样的json特定解析器将是最干净的解决方案。自述页面的底部还有一些对替代品的引用