【问题标题】:Bash: tail, find, and catBash:tail、find 和 cat
【发布时间】:2017-02-16 14:29:16
【问题描述】:

我在每个子目录(每个子目录称为 RUN1、RUN2 等)中有一个以“mod”开头的 csv 文件。我想找到它们,从每个中获取最后一行,然后创建一个只包含这些行的新文件。例如,如果子目录 RUN1 中的 mod1.csv 有:

1, 2, 3

4, 5, 6

子目录RUN2中的mod2.csv有

6,7,8

10,11,12

我想创建一个新文件 results.csv,其中包含

4, 5, 6

10, 11, 12

这是我的尝试:

find $(pwd)/RUN* -name 'mod*.csv' tail -n +1 |xargs cat > results.csv

我得到的错误是

    find: paths must precede expression: tail
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]

我有seen this,但它似乎并没有解决问题。有什么想法吗?

【问题讨论】:

  • 你缺少“-exec”
  • 谢谢@WilliamPursell,但我应该把它放在哪里?对 bash 来说还是相当新的。
  • 顺便说一句,find 程序与bash 无关。它是独立的,不是内置的shell,可以从任何语言调用。

标签: bash


【解决方案1】:

我认为 Chepner 忘了告诉 -exec 会发生什么:

find ./RUN* -name 'mod*.csv' -exec tail -1 {} \; > results.csv

【讨论】:

    【解决方案2】:

    您忘记了 -exec 主节点,并且您不应该需要 xargs

    find ./RUN* -name 'mod*.csv' -exec tail -n +1 {} \; > results.csv
    

    您的xarg 命令将获取每个文件的最后一行,并将其视为文件名。

    【讨论】:

    • 这需要运行多长时间?我不确定我的进程是否挂起......
    • 大部分运行时间应该花在(递归地)在. 中搜索以找到匹配的文件。您可以运行find ./RUN* -name 'mod*.csv' 来简单地列出所涉及的 CSV 文件。
    • 列出文件只需不到 5 秒的时间。每个子目录只有一个匹配的文件。有什么办法可以加快这个速度吗?到目前为止已经用了 5 分钟。
    • 抱歉,我对-execxargs 的工作方式有点混淆。 tail 需要一个显式的 {} 参数;现在,第一个 tail 在尝试从其标准输入读取时被阻塞。
    猜你喜欢
    • 1970-01-01
    • 2012-12-29
    • 2020-12-03
    • 2013-07-23
    • 1970-01-01
    • 1970-01-01
    • 2021-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多