【问题标题】:grep on multiple files, output to multiple files named after the original filesgrep 对多个文件,输出到以原始文件命名的多个文件
【发布时间】:2021-12-22 11:04:19
【问题描述】:

我有一个文件夹,里面有 64 个项目,编号如下:1-1、1-2、1-3、1-4、2-1 ... 我想要做的是对特定模式的文件 1-1 进行 grep,将输出保存到名为 1-1a 的新文件中,然后转到文件 1-2,依此类推。所有 64 个文件的模式保持不变。

我尝试了 find-exec grep 'pattern' "{} > {}a" 的变体,但似乎我不能在一行中使用 {} 两次,并且仍然将其解释为变量。我也愿意接受使用 awk 或类似工具的建议。

【问题讨论】:

    标签: shell variables unix awk grep


    【解决方案1】:

    用 awk 应该很容易

    awk '/pattern/{print > FILENAME "a"}' *
    

    为了使用 find,请将 * 替换为 find 命令的结果:

    awk '/pattern/{print > FILENAME "a"}' $(find ...)`
    

    ...但仅当文件名不包含特殊字符(例如空格)并且列表不会增长太长时才这样做。在这些情况下使用循环。

    【讨论】:

    • 谢谢你,效果很好!
    【解决方案2】:

    你可以使用这个find 命令

    find . -name '*[0-9]-*[0-9]' -exec bash -c '
    for f; do grep "pattern" "$f" > "${f}a"; done' - {} +
    

    请注意,您可以多次运行此命令,它不会继续创建 13-3aa13-3aaa 等文件。

    【讨论】:

    • 我不知道为什么,但我得到的只是一个名为 13-3a 的文件作为输出,没有任何内容被 grep。编辑:将末尾的 + 更改为 \;使其遍历所有文件,但仍未搜索到该模式。我应该更新我的操作系统……
    • 对不起,我犯了一个错误,现在已修复。在-exec 之后使用+ 时,它会避免为每个条目创建bash 子进程,并一次将多个文件名传递给-exec 命令。
    猜你喜欢
    • 2016-10-04
    • 1970-01-01
    • 2019-07-31
    • 2017-07-17
    • 2017-03-15
    • 2020-05-02
    • 1970-01-01
    • 2018-04-26
    • 2013-08-31
    相关资源
    最近更新 更多