Использование переменной как всего действия в gawk

У меня есть большое количество файлов с несколькими столбцами, которые нужно быстро преобразовать в файлы меньшего размера по столбцу. Самый быстрый способ, который я нашел для этого (пока), заключается в следующем:

gawk '{print $3, $2 >> "period.chidrop"; print $4, $2 >> "Tconj.chidrop"; print $5, $2 >> "oc.chidrop"}' generation.1*

Моя проблема в том, что действие должно быть динамическим, но я не могу заставить переменную работать как все действие.

Пример:

gawkcmd='print $3, $2 >> "period.chidrop"; print $4, $2 >> "Tconj.chidrop"; print $5, $2 >> "oc.chidrop"'
gawk -v gawkcmd="$gawkcmd" '{gawkcmd}' generation.1*

Это выполняется без сообщения об ошибке, но файлы не создаются. Я могу напечатать строку:

gawk -v gawkcmd="$gawkcmd" 'BEGIN{print gawkcmd}{gawkcmd}' generation.1*

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


person user3719139    schedule 10.06.2014    source источник
comment
Вы хотите, чтобы данные каждого столбца находились в отдельных файлах?   -  person Devesh    schedule 10.06.2014
comment
@DevPa Правильно (в основном). Первый столбец всегда игнорируется, а второй столбец всегда печатается вместе с одним из оставшихся столбцов. Он должен быть динамическим, поскольку порядок столбцов может меняться от каталога к каталогу.   -  person user3719139    schedule 10.06.2014
comment
Чтобы быть более ясным, не могли бы вы предоставить образец ввода/вывода   -  person Devesh    schedule 10.06.2014


Ответы (1)


Последний пример не работает, потому что программа не является переменной. Как написано (с пробелом между -v gawkcmd="$gawkcmd" и 'BEGIN { print gawkcmd } { gawkcmd } он оценивает переменную в каждой строке, но не выполняет никакой печати (хотя и подавляет печать по умолчанию).

Вы близки, хотя; вы можете использовать:

gawk "{ ${gawkcmd} }" generation.1*

где фигурные скобки вокруг ${gawkcmd} необязательны, но подчеркните, что это не все опечатки.

person Jonathan Leffler    schedule 10.06.2014
comment
Извините, это опечатка в транскрипции. В моем сценарии есть место. Кажется, это работает отлично. Мне придется немного поиграть с ним, чтобы увидеть, смогу ли я заставить работать условные выражения, но большое вам спасибо! - person user3719139; 10.06.2014