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

bybem2ql  于 2023-06-24  发布在  Shell
关注(0)|答案(4)|浏览(164)

我在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,尽管从我的研究来看,这似乎是最好的方法。

3phpmpom

3phpmpom1#

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

yzckvree2#

我猜您的head版本不支持-q选项; man head(在Mac上运行)显示什么?
小型awk解决方案:

awk '{ print ; nextfile }' *

当一个文件被处理时,第一行被打印出来,然后我们跳到下一个文件;最终结果是我们只打印每个文件的第一行。
请记住,这可能会产生一些奇怪的结果,这取决于什么匹配*。二进制文件?目录?

zpjtge22

zpjtge223#

我没有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以使其在终端会话中持久化。

r1zhe5dt

r1zhe5dt4#

我希望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中。
[* 这只是复制/粘贴上述链接。]
为了跳过/忽略第一行,可以这样修改:
grep -m 1“^[^=]”
.txt #这应该跳过第一行
第一个^指的是行的开头,所以注解从第一个字符开始的行不会被排除。[^=]表示任何不以'='开头的行。

相关问题