Как напечатать первую строку из нескольких файлов? - PullRequest
0 голосов
/ 25 января 2020

Я нахожусь на Ма c 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

Согласно этой странице , вы можете использовать любую из следующих команд для удаления заголовков:

-q, --quiet, --silent

Поэтому я изменил свою команду следующим образом:

head -n1 -q *

Но она выдает следующее сообщение об ошибке:

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

Как отобразить список первой строки каждого файл без заголовка. В решении не обязательно использовать head, хотя, по моим исследованиям, это лучший подход.

Ответы [ 3 ]

1 голос
/ 25 января 2020

Я предполагаю, что ваша версия head не поддерживает параметр -q; что показывает man head (работает на Ma c)?

Небольшое решение awk:

awk '{ print ; nextfile}' *

При обработке файла печатается первая строка, затем мы переходим к следующему файлу; net В результате мы печатаем только первую строку каждого файла.

Имейте в виду, что это может привести к некоторым странным результатам в зависимости от того, что соответствует * ... двоичным файлам? каталоги

1 голос
/ 25 января 2020

У меня нет Ма c, чтобы проверить это, но я думаю, что это два варианта.

Вариант 1. Используйте хвост, чтобы получить последнюю строку вывод из головы.

Если вы перебираете каждый файл, вы можете использовать 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 *.

. Вы можете поместить ее в свой .bashr c, чтобы она оставалась доступной после открытия нового терминал.

Опция 2. Установка coreutils

Опция -q не работает, поскольку некоторые операционные системы используют разные исполняемые файлы из утилит ядра gnu. У вас должна быть возможность установить gnu-coreutils с помощью:

brew install coreutils

Это даст вам доступ к ghead реализации головы GNU, которая должна поддерживать опцию -q.

Есть также варианты, чтобы coreutils переопределял системные утилиты по умолчанию, но так как у меня нет Ma c, я не могу подтвердить, как это сделать.

Вот ответ, который предлагает, как это сделать. it: 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"

Как и в приведенном выше функциональном решении, вам может понадобиться чтобы добавить это в .bashr c, чтобы сделать его постоянным во время сеансов терминала.

1 голос
/ 25 января 2020
for f in *.txt; do head -n 1 $f; done
...