如何打印多个文件的第一行?
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
第一个 ^ 指的是行首,因此不会排除在第一个字符之后开始注释的行。 [^=] 表示任何不以“=”开头的行。
我在 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
第一个 ^ 指的是行首,因此不会排除在第一个字符之后开始注释的行。 [^=] 表示任何不以“=”开头的行。