Вопрос или проблема
Как короче и читабельнее вывести n-ю строку файла?
Это о Unix и Linux.
Да, существует много решений для этого, например, см. http://mywiki.wooledge.org/BashFAQ/011. Некоторые из них работают очень быстро (не читают весь файл), а некоторые медленные, но короткие и гораздо более читаемые. Мне интересно решение, которое работает с маленькими файлами < 1 МБ, которое легко запомнить и читать, и которое должно завершаться менее чем за 1 секунду. Конечно, я мог бы написать скрипт или создать алиас оболочки, но когда я прихожу к вновь установленным компьютерам, мне сначала нужно восстановить свою среду, поэтому я предпочитаю решение, которое работает с большинством дистрибутивов Unix и Linux из коробки, или по крайней мере после установки нужного инструмента через менеджер пакетов. Может кто-то предложить лучшее?:
awk NR==42 file
Решения с awk
и perl
имеют недостаток в том, что они продолжают читать после вывода N-й строки. Команда yes
, которая печатает бесконечное количество строк, может быть использована для проверки этого.
Короткое решение, которое страдает от этой же проблемы:
sed -n 42p file
Это решение завершает работу после печати строки:
sed -n '42{p;q}' file
Пока есть команда head и tail
Это напечатает 12-ю строку файла abc. Сохраните tail -n 1
, и просто замените 12 на номер строки, которую хотите напечатать.
$ head -n 12 abc | tail -n 1
Если вы готовы установить инструмент через менеджер пакетов, то вы должны быть готовы использовать написанный вами скрипт, и также, я предполагаю, что, возможно, все ваши дистрибутивы Linux и Unix имеют команды head и tail. Но если нет, то установите их, или установите awk или perl, конечно, что бы вы ни использовали, будет работать одинаково на любой системе, пока она имеет инструмент, будь то head и tail, awk или perl.
используйте sed:
sed -n 42p file
Это легко ввести (нет заглавных букв, не нужно нажимать “Shift”) и очень коротко.
Не думаю, что смогу превзойти ваш пример AWK по краткости или читаемости, но вот пример на Perl
perl -ne 'print if $. == 42' file
Вы можете использовать sed. В следующей команде опция -n
отключает вывод каждой строки, так что выполняется только явный вывод (p
команды). 12
соответствует 12-й строке, и p выполняет печать.
sed -n '12 p'
Ответ или решение
Для получения n-й строки файла в Unix и Linux существует несколько эффективных решений. При этом важно, чтобы команда была легко запоминаемая и читаемая, особенно когда речь идет о работе с небольшими файлами размером менее 1 МБ. Рассмотрим несколько вариантов:
-
Использование
sed
:
Один из самых простых и читаемых вариантов — это командаsed
. Чтобы вывести n-ю строку, вы можете использовать следующий синтаксис:sed -n '42p' файл
Здесь
-n
отключает автоматическую печать всех строк, а ’42p’ указывает на то, что нужно распечатать только 42-ю строку. Этот метод компактен и довольно производителен. -
Использование
awk
:
Командаawk
также является отличным вариантом:awk 'NR==42' файл
Здесь
NR
представляет номер текущей строки. Эта команда, хотя и немного более длинная, также достаточно ясна и понятна. -
Комбинация
head
иtail
:
Вы можете воспользоваться комбинацией командhead
иtail
. Например, чтобы получить 12-ю строку файла, выполните:head -n 12 файл | tail -n 1
Этот метод может оказаться менее эффективным для больших файлов, так как он читает их по частям, но для небольших файлов это вполне подходящий способ.
-
Использование Perl:
Если у вас установлен Perl, вы также можете использовать его для достижения этой цели:perl -ne 'print if $. == 42' файл
Здесь
$.
представляет текущий номер строки. Этот способ менее распространён, однако достаточно эффективен.
Все представленные команды доступны в большинстве Unix и Linux дистрибутивов «из коробки» или после установки стандартных утилит через менеджеры пакетов. Они подходят для небольших файлов и, в общем, выполняются быстро. Если для вас важна максимальная простота и читаемость, то, вероятно, наилучшим вариантом будет использовать sed
с -n
и p
.
Таким образом, вы можете легко и быстро получить любую n-ю строку вашего файла, используя любые из предложенных методов.