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

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}" "$@" } 
  • как совместить точный субдомен с grep, игнорируя другие
  • sed работает при вводе из эха, но не из файла
  • Разделить слова от `read` и хранить до массива?
  • Имя пути в сценарии оболочки содержит дополнительные символы при запуске скрипта
  • Имена файлов каталогов с sed с пробелами
  • Как узнать, написан ли сценарий оболочки в bash или sh
  • Как скрипт может выполнить себя через какой-то exec снова?
  • Шелл Шрифт над SSH
  • Скрипт входа для bash не загружается
  • Тест существования файла Bash всегда верен
  • SSH для хоста и введите пароль со сценарием оболочки
  • Найти и использовать путь к файлу?
  • Linux и Unix - лучшая ОС в мире.