如何打印多个文件的第一行?

How to print the first line of multiple files?

我在 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,您可以使用以下任一命令删除 header:

-q, --quiet, --silent

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

head -n1 -q *

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

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

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

for f in *.txt; do head -n 1 $f; done

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

一个小awk解决方案:

awk '{ print ; nextfile}' *

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

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

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

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

如果您遍历每个文件,您可以使用 tail -n 1 到 trim 来自 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 以使其在终端会话中持久存在。

我希望 grep 版本在 Mac 中应该是可以接受的,正如本次讨论的第二个答案中所解释的那样 (https://askubuntu.com/questions/701514/how-to-select-the-first-line-from-each-file-in-a-directory-and-print-it-into-a-n)

grep -m 1 '.' *.txt >output.file

grep 将匹配任何字符并在第一次匹配后退出,即 grep 将输出所有输入文件的第一行,我们将这些保存在 out.txt.

[*就是上面link的copy/paste.]

对于skipping/ignoring第一行,可以这样修改:

grep -m 1 "^[^=]" *.txt # This should skip the first line

第一个 ^ 指的是行首,因此不会排除在第一个字符之后开始注释的行。 [^=] 表示任何不以“=”开头的行。