Regex awk(或sed/grep)来获取子字符串的出现次数
我在bash变量中有一个json字符串,如下所示:Regex awk(或sed/grep)来获取子字符串的出现次数,regex,bash,awk,sed,grep,Regex,Bash,Awk,Sed,Grep,我在bash变量中有一个json字符串,如下所示: { "items": [ { "foo": null, "timestamp": 1553703000, "bar": 123 }, { "foo": null, "timestamp": 1553703200, "bar": 456 }, { "foo": null
{
"items": [
{
"foo": null,
"timestamp": 1553703000,
"bar": 123
},
{
"foo": null,
"timestamp": 1553703200,
"bar": 456
},
{
"foo": null,
"timestamp": 1553703400,
"bar": 789
}
]
}
我想知道有多少时间戳在给定的日期时间之后,所以如果我有1553703100,它将返回2
如果你能给我这个数字,我会给你额外的假想点数
作为实现这一目标的一步,我只想在字符串中获得timestamp:\d+的匹配项,以便在bash脚本中循环它们
我曾经使用过sed和grep,但从未使用过awk,从我的阅读来看,这可能更适合这个任务
其他资料:
-如上所述,json已经打印好了,所以时间戳总是在单独的行上。
-这是在Cygwin中运行的,所以我有awk/gawk、sed和grep/egrep,但可能没有其他。
-json中可以有任意数量的时间戳。编辑:下面列出的第二种方法存在严重问题,@EdMorton对此进行了非常有益的概述。我选择保留旧代码用于教育目的
避免的substr和捕获的空字符串i:
编辑:下面列出的第二种方法有严重的问题,@EdMorton对此进行了非常有益的概述。我选择保留旧代码用于教育目的
避免的substr和捕获的空字符串i:
您没有提供预期的输出,因此这是一个猜测,但这是您正在尝试做的吗
$ echo "$var" | jq '.items[].timestamp'
1553703000
1553703200
1553703400
或者可能:
$ echo "$var" | jq '.items[].timestamp | select(. > 1553703100)'
1553703200
1553703400
或:
警告:我只是在学习jq,所以可能有更好的方法来完成上述任务 您没有提供预期的输出,因此这只是一个猜测,但这就是您想要做的吗
$ echo "$var" | jq '.items[].timestamp'
1553703000
1553703200
1553703400
或者可能:
$ echo "$var" | jq '.items[].timestamp | select(. > 1553703100)'
1553703200
1553703400
或:
警告:我只是在学习jq,所以可能有更好的方法来完成上述任务 您还可以快速实现python解决方案: 输入: 代码: 输出: 计数代码: 输出:
您还可以快速实现python解决方案: 输入: 代码: 输出: 计数代码: 输出:
使用“jq”来解析JSON@GillesQuenot,OP指定可用的工具jq在cygwin上可用。我不知道如何使用jq,因为每个人都忙着告诉我如何使用它,以至于他们忘记发布实际的解决方案。谢谢大家!两个答案都很好。我没有安装jq,所以我将使用awk解决方案。希望我能将2个答案标记为已接受:-使用“jq”解析JSON@GillesQuenot,OP指定可用的工具jq在cygwin上可用。我不知道如何使用jq,因为每个人都忙着告诉我如何使用它,以至于他们忘记发布实际的解决方案。谢谢大家!两个答案都很好。我没有安装jq,所以我将使用awk解决方案。希望我能将2个答案标记为已接受:-整洁,谢谢。OP指定他希望记录的计数大于指定的时间戳。在jq里有什么办法吗?@vintnes我在谷歌上搜索了几个jq的例子,并根据它们更新了我的答案。很好,谢谢。OP指定他希望记录的计数大于指定的时间戳。在jq?@vintnes中有什么方法可以做到这一点吗?我在谷歌上搜索了几个jq示例,并根据它们更新了我的答案。substr的第二个参数是substring的起始位置。awk中的所有数组索引、字段和字符串都从1开始,而不是从0开始。当您使用0作为substr的第二个参数时,awk将其视为任何其他无效值,请尝试awk“BEGIN{print substrbanas,-27,3}”,并将其视为指定了1。第三个参数是您希望substr的长度。使用长度$2与将该字段留空相同,因为它将为您提供字符串的完整长度。ITYM substr$2,1,长度$2-1,但您可以使用$2+0来去除。最终打印应该是打印i+0,这样即使没有值匹配,也会得到数字输出,而不是空字符串输出。substr的第二个参数是子字符串的起始位置。awk中的所有数组索引、字段和字符串都从1开始,而不是从0开始。当您使用0作为substr的第二个参数时,awk将其视为任何其他无效值,请尝试awk“BEGIN{print substrbanas,-27,3}”,并将其视为指定了1。第三个参数是您希望substr的长度。使用长度$2与将该字段留空相同,因为它将为您提供字符串的完整长度。ITYM substr$2,1,长度$2-1,但您可以使用$2+0来去除。最终打印应该是打印i+0,因此即使没有值匹配,也会得到数字输出,而不是在这种情况下的空字符串输出。
$ echo "$var" | jq '[.items[].timestamp | select(. > 1553703100)] | length'
2
$ cat data.json
{
"items": [
{
"foo": null,
"timestamp": 1553703000,
"bar": 123
},
{
"foo": null,
"timestamp": 1553703200,
"bar": 456
},
{
"foo": null,
"timestamp": 1553703400,
"bar": 789
}
]
}
$ cat extract_value2.py
import json
tLimit = 1553703100
with open('data.json') as f:
data = json.load(f)
print([t['timestamp'] for t in data["items"] if t['timestamp'] > tLimit])
$ python extract_value2.py
[1553703200, 1553703400]
$ cat extract_value2.py
import json
tLimit = 1553703100
with open('data.json') as f:
data = json.load(f)
print(len([t['timestamp'] for t in data["items"] if t['timestamp'] > tLimit]))
$ python extract_value2.py
2