Простая функция обертки awk или псевдоним

Я видел, как кто-то использовал псевдоним bash или функцию на основе awk, которая мне понравилась по своей простоте, но не помню, как ее реализовать (в bash).

Допустим, у вас есть большой форматированный файл, из которого вам нужно выбрать команду 3, 4, 7-й столбец.

Для этого вы можете сделать:

cat bigfile.txt | awk '{print $3, $4, $7}' |less 

Мне нужен псевдоним (или функция) pawk, который я могу использовать как:

 cat bigfile.txt | pawk 3,4,7 | less 

чтобы получить тот же эффект. Количество столбцов может быть произвольным и может включать NF. Я попробовал пару вещей, чтобы реализовать это, но не могу понять, как передать произвольное количество переменных awk.

  • Сценарий оболочки для прокрутки через папку и файлы списка
  • Вывод строки в нижнем правом углу терминала
  • Как вы перемещаете все файлы (включая скрытые) из одного каталога в другой?
  • bash myscript.sh работает в bash, но первая строка: #! / usr / bin / sh
  • как это сделать: dd if = coolstuff.iso of = (ssh kev @ mypi)
  • Ограничение размера файла превышено в bash
  • Как wc -l `ls` дает фактическое количество строк?
  • Как сохранить длинный список имен хостов для быстрого использования SSH?
  • 2 Solutions collect form web for “Простая функция обертки awk или псевдоним”

    Вы можете использовать такую ​​функцию:

     function pawk(){ awkString="{print " for var in "$@" do awkString+=" \$$var" done awkString+=" }" awk "$awkString" } 

    Пример:

     cat bigfile.txt | pawk 3 4 7 | less 

    Да, это, вероятно, было бы функцией, а не псевдонимом. Имея это в виду, попробуйте следующее:

     pawk(){ fields="$(sed -E 's/(^|,)/ \1\$/g'<<<"$1")" shift awk "{print $fields}" "$@" } 

    Затем вы можете запустить его как:

     pawk 3,4,7 bigfile.txt | less 

    Или

     cat bigfile | pawk 3,4,7 | less 

    Или даже

     pawk 3,4,7 * | less 

    Трюк добавляет $ перед каждой запятой и в начале первого аргумента, данного функции (так что 1,2,3 становится $1,$2,$3 ) и сохраняет полученную строку в переменной оболочки. Затем вы запускаете awk в двойных кавычках, чтобы переменная $fields расширялась, и awk рассматривал ее как firlds, которые она должна печатать.

    sed -E должен быть довольно портативным, но, тем не менее, herestring ( <<<"$1" ). Для полностью переносимой версии используйте следующее:

     pawk(){ fields="$(printf '$%s' $(echo 1,2,3 | sed 's/,/,\$/g'))" shift awk "{print $fields}" "$@" } 
    Interesting Posts

    Поиск на основе абзаца с использованием до и после условий UNIX KSH

    Неправильное поведение SED с входным файлом

    Сценарий Bash для произвольного расширения имени файла

    Невозможно сделать anyfs-tools. Мой пакет e2fslibs кажется не совместимой версией

    iptables / https: маршрутизатор, получающий трафик INPUT, исходящий от порта 443

    Хвост нескольких файлов и вывод в качестве дополнительного столбца с результатами поиска

    Как отформатировать пароль с помощью SCP

    Собственный драйвер NVIDIA по проблемам Jessie Debian

    shell_exec не может создать файл

    изменить владельца файла и его родительские каталоги

    Сценарий Bash не изменит каталог

    начать загрузку rsync до завершения загрузки

    Каковы основные различия между «туннелями SSH» и «обратными IP-адресами Squid» в отношении очистки веб-страниц и личного просмотра?

    Блокируйте ввод пользователя на интерактивной оболочке с помощью «cat / dev / ttyS0»

    Пароль-Меньше SSH Вход не работает

    Linux и Unix - лучшая ОС в мире.