【问题标题】:How to print the first line of multiple files?如何打印多个文件的第一行?
【发布时间】:2020-01-25 12:09:46
【问题描述】:

我在 Mac Os 10.14.6 上,并且有一个包含数百个文本文件的目录。

在终端中,我想显示每个文件第一行的列表。我该怎么做?



我尝试过的步骤

四处搜索,我认为解决方案是使用名为head 的命令。这是我尝试过的命令: head -n 1 *

但是,它会产生如下输出:

==> Minutes.txt <==
Minutes of the meeting

==> Daily Report.txt <==
Daily Report for Feb

==> Important incidents.txt <==
Incidents that happened yesterday

我不想要 File 1.text 标题。我只是希望它是这样的列表:

Minutes of the meeting
Daily Report for Feb
Incidents that happened yesterday

根据this page,您可以使用以下任一命令删除标题:

-q, --quiet, --silent

所以我修改了我的命令如下:

head -n1 -q *

但它会产生以下错误消息:

head: illegal option -- q
usage: head [-n lines | -c bytes] [file ...]

如何在没有标题的情况下显示每个文件的第一行列表。该解决方案不必使用head,尽管根据我的研究,这似乎是最好的方法。

【问题讨论】:

    标签: bash shell terminal head


    【解决方案1】:
    for f in *.txt; do head -n 1 $f; done
    

    【讨论】:

    • fwiw,对于大量文件,显式循环结构(forwhile)可能会减慢速度,因为需要一遍又一遍地调用 head再次;您可以从time (&lt;solution&gt;) 大致了解时间安排,例如time (for f in *.txt ... done);在我的系统上,有 20 个 *.txt 文件 time 显示此解决方案需要 0.4-0.6 秒,而 time 显示 awkhead -q -n1 解决方案需要 0.02-0.10 秒
    【解决方案2】:

    我猜你的head 版本不支持-q 选项; man head(在您的 Mac 上运行)显示什么?

    一个小的awk解决方案:

    awk '{ print ; nextfile}' *
    

    在处理一个文件时,打印第一行,然后我们跳到下一个文件;最终结果是我们只打印每个文件的第一行。

    请记住,这可能会产生一些奇怪的结果,具体取决于与 * ... 二进制文件匹配的内容?目录?

    【讨论】:

    • Keep in mind this could generate some odd results depending on what matches * ... binary files? directories?我只有txt文件应该可以吧?
    【解决方案3】:

    我没有 Mac 来测试这个,但我认为这是两个选项。

    选项 1。 使用tail获取head输出的最后一行。

    如果您遍历每个文件,您可以使用tail -n 1 修剪来自head 的输出,例如:

    for FILENAME in *; do head -n 1 $FILENAME | tail -n 1; done
    

    如果你不想重复输入,你可以定义一个函数,例如

    line1() { for FILENAME in "$@"; do head -n 1 $FILENAME | tail -n 1; done }
    

    然后将函数调用为line1 *

    您可以将它放在您的 .bashrc 中,以便在打开新终端后保持可用。

    选项 2。 安装 coreutils

    -q 选项不起作用,因为某些操作系统使用与 gnu 核心实用程序不同的可执行文件。您应该能够安装 gnu-coreutils:

    brew install coreutils
    

    这应该让您可以访问ghead head 的 gnu 实现,它应该支持 -q 选项。

    还有一些选项可以让 coreutils 覆盖默认系统实用程序,但由于我没有 Mac,我无法确认如何操作。

    这是一个建议如何做的答案:https://apple.stackexchange.com/questions/69223/how-to-replace-mac-os-x-utilities-with-gnu-core-utilities#answer-69332

    它建议您在路径中预先添加实用程序:

    PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"
    

    与上面的函数解决方案一样,您可能需要将其添加到 .bashrc 以使其在终端会话中保持不变。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-13
      • 2022-06-10
      • 2014-07-06
      • 1970-01-01
      相关资源
      最近更新 更多