Простая функция обертки 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.

  • Автоматически экспортировать переменную в каждый сеанс ssh
  • Просмотреть расширенные атрибуты с помощью coreutils ls на Mac
  • Оптимизация сценария оболочки с длительным циклом работы
  • Экспорт истории команд в скрипт командной оболочки
  • Заменить процесс экрана с экрана
  • Можно ли использовать утилиту Rename для упрощения этого скрипта, который использует Find и Mv?
  • Список специальных символов в оболочке
  • RYSNC над 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}" "$@" } 
    Linux и Unix - лучшая ОС в мире.