Как короче и читабельнее вывести n-ю строку файла?

Вопрос или проблема

Как короче и читабельнее вывести 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 МБ. Рассмотрим несколько вариантов:

  1. Использование sed:
    Один из самых простых и читаемых вариантов — это команда sed. Чтобы вывести n-ю строку, вы можете использовать следующий синтаксис:

    sed -n '42p' файл

    Здесь -n отключает автоматическую печать всех строк, а ’42p’ указывает на то, что нужно распечатать только 42-ю строку. Этот метод компактен и довольно производителен.

  2. Использование awk:
    Команда awk также является отличным вариантом:

    awk 'NR==42' файл

    Здесь NR представляет номер текущей строки. Эта команда, хотя и немного более длинная, также достаточно ясна и понятна.

  3. Комбинация head и tail:
    Вы можете воспользоваться комбинацией команд head и tail. Например, чтобы получить 12-ю строку файла, выполните:

    head -n 12 файл | tail -n 1

    Этот метод может оказаться менее эффективным для больших файлов, так как он читает их по частям, но для небольших файлов это вполне подходящий способ.

  4. Использование Perl:
    Если у вас установлен Perl, вы также можете использовать его для достижения этой цели:

    perl -ne 'print if $. == 42' файл

    Здесь $. представляет текущий номер строки. Этот способ менее распространён, однако достаточно эффективен.

Все представленные команды доступны в большинстве Unix и Linux дистрибутивов «из коробки» или после установки стандартных утилит через менеджеры пакетов. Они подходят для небольших файлов и, в общем, выполняются быстро. Если для вас важна максимальная простота и читаемость, то, вероятно, наилучшим вариантом будет использовать sed с -n и p.

Таким образом, вы можете легко и быстро получить любую n-ю строку вашего файла, используя любые из предложенных методов.

Оцените материал
Добавить комментарий

Капча загружается...