Awk 从html文件中搜索出url,然后选择最上面的一个
我有很多(比如17000个)包含链接的html文件。每个html文件可以包含许多链接,但它们都引用相同的视频mp4,但分辨率不同。我只想grep出最高分辨率的链接,也就是说,如果有720、1080或1440的引用,我想要1440的链接,而不是其他的链接。但最大分辨率各不相同,因此我不能只硬编码1440(例如,在另一个1440中,一个html文件中的最大分辨率可能是720) html文件的内容每个都在2k到80k之间,并且具有具有这种结构的重复内容,有时在一行中,有时跨越多行Awk 从html文件中搜索出url,然后选择最上面的一个,awk,grep,html-parsing,Awk,Grep,Html Parsing,我有很多(比如17000个)包含链接的html文件。每个html文件可以包含许多链接,但它们都引用相同的视频mp4,但分辨率不同。我只想grep出最高分辨率的链接,也就是说,如果有720、1080或1440的引用,我想要1440的链接,而不是其他的链接。但最大分辨率各不相同,因此我不能只硬编码1440(例如,在另一个1440中,一个html文件中的最大分辨率可能是720) html文件的内容每个都在2k到80k之间,并且具有具有这种结构的重复内容,有时在一行中,有时跨越多行 {"url":"ht
{"url":"https://localhost/676/hg66333/56354446353.mp4?user=893668f5-8fab-4916-9697-f45aee61aa01",
uploadedBy="fdb778f8-c347-4c28-90f4-d8be4b4a20f0",
owner="3ba62dba-8fb1-468d-8349-2e42a5330785",video="1024p",
group="a4307f09-4804-4802-9ba4-8e8eaf3d3439"},
{"url":"https://localhost/676/hg66333/56354446384.mp4?user=893668f5-8fab-4916-9697-f45aee61aa01",
uploadedBy="fdb778f8-c347-4c28-90f4-d8be4b4a20f0",
owner="3ba62dba-8fb1-468d-8349-2e42a5330785",
video="720p", group="a4307f09-4804-4802-9ba4-8e8eaf3d3439"}
我想从grep那里得到的只是
而不是(因为这是较低的分辨率,单个文件中的最高分辨率为1024,较低的分辨率为720)
使用grep-oh和“\”url\”:\“^”]我无法找到解决方案*
我想我需要做的是得到所有的url,视频=,按url排序,然后视频从高到低,然后取最上面的一个,但是。。。。。我不知道,现在只是摸索着尝试我能在谷歌上找到的任何东西,并改变它
有人能帮忙吗
哦,mp4总是出现在视频质量之前
我正在使用Darwin MacBook-Pro.local 18.6.0 Darwin内核版本18.6.0:Thu Apr 25 23:49:07 PDT 2019;root:xnu-4903.261.4~4/使用标准UNIX工具(包括任何UNIX机箱上任何shell中的任何awk)发布\u X86\u 64 X86\u 64:
$ cat tst.awk
BEGIN { OFS="\t" }
{
while ( match($0,/("url":|[[:alpha:]]+=)"[^"]+"/) ) {
tag = val = substr($0,RSTART,RLENGTH)
$0 = substr($0,RSTART+RLENGTH)
sub(/[:=].*/,"",tag)
sub(/[^:=]*[:=]/,"",val)
gsub(/^"|"$/,"",tag)
gsub(/^"|"$/,"",val)
f[tag] = val
if ( tag == "video" ) {
print f["video"], f["url"]
}
}
}
它所依赖的只是任何给定的tag=value字符串本身并不是跨行拆分的,它们都遵循您在问题中显示的格式。使用标准UNIX工具,包括任何UNIX框上任何shell中的任何awk:
$ cat tst.awk
BEGIN { OFS="\t" }
{
while ( match($0,/("url":|[[:alpha:]]+=)"[^"]+"/) ) {
tag = val = substr($0,RSTART,RLENGTH)
$0 = substr($0,RSTART+RLENGTH)
sub(/[:=].*/,"",tag)
sub(/[^:=]*[:=]/,"",val)
gsub(/^"|"$/,"",tag)
gsub(/^"|"$/,"",val)
f[tag] = val
if ( tag == "video" ) {
print f["video"], f["url"]
}
}
}
它所依赖的只是任何给定的tag=value字符串本身并不是跨行拆分的,它们都遵循您在问题中显示的格式。这是一个非常通用的解决方案。多亏了while循环,这将处理任何文件。包含多个条目的单行文件。这是一个很好的解决方案。@Steve这解决了你的问题吗?你对此有什么问题吗?这是一个非常通用的解决方案。多亏了while循环,这将处理任何文件。包含多个条目的单行文件。这是一个很好的解决方案。@Steve这解决了你的问题吗?你对此有什么问题吗?