Написание сокращенного оператора awk в профиле bash?

Я хочу сделать функцию в моем профиле bash, чтобы сократить:

awk 'BEGIN{OFS="\t";FS="\t"}{}'

Я хотел бы иметь возможность печатать:

awk2 '{print $0}'

И сделайте так:

awk 'BEGIN{OFS="\t";FS="\t"}{print $0}'

Если он не обнаружит BEGIN на входе... в этом случае он вернется к исходному функционированию awk.

Кто-нибудь знает, как будет выглядеть эта функция?


person user1382685    schedule 27.06.2012    source источник


Ответы (2)


Это легко сделать, если вы используете awk-v вместо блока BEGIN.

awk2() {
   awk -F'\t' -v OFS='\t' "$@"
}

-v используется для присвоения переменных и выполняется перед обработкой строки.

person jordanm    schedule 27.06.2012
comment
Вы забыли обнаружить BEGIN. - person Dennis Williamson; 27.06.2012
comment
У вас может быть несколько блоков BEGIN, чтобы вы могли сделать awk "BEGIN {FS = OFS = \"\t\"} $@" телом своей функции. - person Dennis Williamson; 27.06.2012
comment
То, что у меня есть прямо сейчас, что, вероятно, не так близко к работе, это: function awk2() { if [[ $1 !=~ BEGIN ]]; тогда awk -F'\t' -v OFS='\t'$1 fi } - person user1382685; 28.06.2012
comment
@DennisWilliamson, в своем втором комментарии вы поместите аргументы имени файла в скрипт awk. - person glenn jackman; 28.06.2012
comment
@DennisWilliamson, действительно, хотя я не могу объяснить, как это происходит: function awkt { awk "BEGIN {FS=OFS=\"\\t\"} $@"; }; set -x; awkt '$1=="a" {print $2}' tmp/tabfile.txt показывает это расширение: awk 'BEGIN {FS=OFS="\t"} $1=="a" {print $2}' tmp/tabfile.txt -- откуда bash знает, что последний аргумент функции НЕ должен быть частью сценария awk ??? Я думал, что только "$@" был волшебным. "anything here $@" тоже волшебное? - person glenn jackman; 29.06.2012
comment
@DennisWilliamson (продолжение) Я предполагаю, что любой $@ в двойных кавычках действует волшебно, поэтому "prefix $@ suffix" будет добавлять prefix[space] к первому аргументу и добавлять [space]suffix к последнему аргументу. - person glenn jackman; 29.06.2012
comment
@glennjackman: Мне пришлось бы провести несколько тестов, но я почти уверен, что это потому, что $@ в кавычках рассматривается как отдельные элементы массива, и волшебство предоставляется бесплатно. - person Dennis Williamson; 29.06.2012

Псевдоним был бы беспорядочным, я рекомендую вам сократить его, используя функцию bash:

function awk2() {
    awk -F "\t" -v OFS="\t" "$@"
}
person Hai Vu    schedule 27.06.2012
comment
ОП ничего не сказал о псевдонимах. - person Dennis Williamson; 27.06.2012