我有几百个平面html文件,每个文件都包含一些我想输出到单个csv的数据。
例如:
<meta property="og:latitude" content="50.079176">
<meta property="og:longitude" content="-5.694866">
我可以递归grep这两行,并在csv中输出一行,如下所示:
filename,50.079176,-5.694866
这可能来自mac命令行,还是需要bash脚本?或者也许咕噜咕噜可以做到吗?
答案 0 :(得分:1)
你真正应该使用的是一个正确的命令行HTML解析器,如xidel
,但这是一个应该在OS X上运行的脏(非GNU
)awk
解决方案:
$ cat t.awk
#!/usr/bin/awk -f
function extr(s) {
sub(/^.+content="/, "", s);
sub(/".*$/, "", s);
return s;
}
/og:latitude/ && /content/ { latitude = extr($0) }
/og:longitude/ && /content/ { longitude = extr($0); exit }
# the above exit will speed things up but obviously requires
# that the latitude property always precedes the longitude property
# in your files
END {
if (latitude && longitude)
printf "%s,%s,%s\n", FILENAME, latitude, longitude
}
$ find . -name "*.html" -exec ./t.awk {} \;
bar.html,51.123456,-4.654321
foo.html,50.079176,-5.694866
这是一个bash
版本,它迭代当前目录中的所有.html
个文件:
#!/bin/bash
for file in *.html; do
[ -f "${file}" ] || continue
latitude=
longitude=
while IFS= read -r line; do
case ${line} in
*og:latitude*content=*)
latitude=${line##*content=\"}
latitude=${latitude%%\"*}
;;
*og:longitude*content=*)
longitude=${line##*content=\"}
longitude=${longitude%%\"*}
;;
*) ;;
esac
done < "${file}"
[[ -n ${latitude} && -n ${longitude} ]] && echo "${file},${latitude},${longitude}"
done
$ ./test.sh
bar.html,51.123456,-4.654321
foo.html,50.079176,-5.694866