我可以在多个文件中grep文本并将结果输出到单个.csv吗?

时间:2014-05-01 15:18:32

标签: macos grep

我有几百个平面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脚本?或者也许咕噜咕噜可以做到吗?

1 个答案:

答案 0 :(得分:1)

你真正应该使用的是一个正确的命令行HTML解析器,如xidel,但这是一个应该在OS X上运行的脏(非GNUawk解决方案:

$ 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