![提取一行字符串中的整数](https://linux22.com/image/127873/%E6%8F%90%E5%8F%96%E4%B8%80%E8%A1%8C%E5%AD%97%E7%AC%A6%E4%B8%B2%E4%B8%AD%E7%9A%84%E6%95%B4%E6%95%B0.png)
我在从文本文件中提取数字时遇到一些问题。基本上,它看起来像这样(全部在一行;为了稍微提高可读性而在此处分开):
[{"id":1,"width":720,"height":480,"longitude":20.104258199768,"timestamp":1510690197540,"frame_content":"some other informations...},
{"id":2,"width":720,"height":480,"longitude":20.104258199768,"timestamp":1510690197552,"frame_content":"some other informations...},
{"id":3,"width":720,"height":480,"longitude":20.104258199768,"timestamp":1510690197556,"frame_content":"some other informations...},
{"id":4,"width":720,"height":480,"longitude":20.104258199768,"timestamp":1510690197558,"frame_content":"some other informations...},
and so on.....]
我想做的是提取时间戳标签后的所有值。问题是我的文件仅由一行组成这使得它有点棘手,我认为我无法改变这一点。在互联网上查找解决方案后,我尝试了sed
和命令,但到目前为止还没有成功。grep
我将不胜感激任何有关此事的帮助:)
谢谢你!
答案1
假设该文件是格式良好的 JSON 文件,您应该使用 JSON 解析器来解析它。
使用jq
文件上的 JSON 解析器:
$ jq '.[] | .timestamp' filename.json
1510690197540
1510690197552
1510690197556
1510690197558
该表达式.[] | .timestamp
对数组中的所有对象创建隐式循环,并timestamp
从每个对象中提取值。
也可以写成
$ jq '.[].timestamp' file.json
无关:
要找到id
具有最大值的对象timestamp
:
$ jq 'max_by(.timestamp).id' file.json
4
要漂亮地打印 JSON 文件:
$ jq . file.json
答案2
您可以使用
grep -oP '"timestamp":\s*\K\d+' filename
如果所有内容都在一行上并不重要,它会搜索字符串“timestamp:”之后出现的所有数字
结果 :
1510690197540
1510690197552
1510690197556
1510690197558
答案3
awk解决方案:
awk -F, '{ for (i=1;i<=NF;i++) { if ($i~/timestamp/) { split($i,slt,":");print slt[2] } } }' filename
结果:
1510690197540
1510690197552
1510690197556
1510690197558
循环遍历由逗号分隔的每个字段,然后将字段和模式与时间戳进行匹配。如果存在匹配项,则使用 : 将字段拆分为数组 slt。然后打印数组的第二个元素。