【问题标题】:Can I grep for text in multiple files and output the results to a single .csv?我可以对多个文件中的文本进行 grep 并将结果输出到单个 .csv 吗?
【发布时间】:2014-05-01 15:18:31
【问题描述】:

我有几百个平面 html 文件,每个文件都包含一些我想输出到单个 csv 的数据。

例如:

<meta property="og:latitude" content="50.079176">
<meta property="og:longitude" content="-5.694866">

我可以递归地 grep 这两行,并像这样在 csv 中输出一行:

文件名,50.079176,-5.694866

这可以通过 mac 命令行实现吗,还是我需要一个 bash 脚本?或者也许 grunt 可以做到?

【问题讨论】:

    标签: macos grep


    【解决方案1】:

    您真正应该使用的是像xidel 这样的适当的命令行HTML 解析器,但这是一个肮脏的(非GNUawk 解决方案,应该可以在OS X 上运行:

    $ 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
    

    【讨论】:

    • 非常感谢 Adrian - bash 脚本就像一个魅力(我在 for 循环中添加了 'find' 以便递归搜索目录) - 我现在要看看 xidel!
    猜你喜欢
    • 2017-07-17
    • 2014-11-21
    • 2016-06-27
    • 1970-01-01
    • 2012-09-17
    • 2021-12-22
    • 2019-07-31
    • 1970-01-01
    • 2018-11-27
    相关资源
    最近更新 更多