переменная печати внутри awk - PullRequest
2 голосов
/ 01 декабря 2009

В этом скрипте я хочу, чтобы awk печатал переменные $file, $f, $order и sum/NR (все в одной строке)

#!/bin/bash
for file in pmb_mpi tau xhpl mpi_tile_io fftw ; do
    for f in 2.54 1.60 800 ;do
    if [ ${f} = 2.54 ]
    then 
        for order in even odd ; do
#       echo ${file}_${f}_${order}_v1.xls >> P-state-summary.xls
        awk '{sum+=$2} END {print ${file}_${f}_${order}_v1.xls, sum/NR}' ${file}_${f}_${order}_v1.xls >> P-state-summary.xls
        done
    else
#       echo ${file}_${f}_v1.xls >>  P-state-summary.xls
        awk '{sum+=$2} END {print  ${file}_${f}_v1.xls , sum/NR}' ${file}_${f}_v1.xls >>  P-state-summary.xls
    fi
    done
done

Может кто-нибудь из вас, пожалуйста, помогите мне с этим?

Ответы [ 2 ]

3 голосов
/ 01 декабря 2009

awk не выходит и не получает переменные оболочки для вас, вы должны передать их как awk переменные:

pax> export x=XX
pax> export y=YY
pax> awk 'BEGIN{print x "_" y}'
_
pax> awk -vx=$x -v y=$y 'BEGIN{print x "_" y}'
XX_YY

Существует еще один способ сделать это, используя двойные кавычки вместо одинарных кавычек (так что bash подставляет значения до того, как awk их увидит), но затем вам нужно начать экранировать символы $ и все другие вещи в вашей awk команде:

pax> awk "BEGIN {print \"${x}_${y}\"}"
XX_YY

Я предпочитаю использовать явное создание переменных.

Кстати, есть другое решение вашего предыдущего вопроса здесь , которое должно работать.

1 голос
/ 01 декабря 2009

Вы можете сделать это:

echo -n "${file}_${f}_${order}_v1.xls " >> P-state-summary.xls
# or printf "${file}_${f}_${order}_v1.xls " >> P-state-summary.xls
awk '{sum+=$2} END {print sum/NR}' "${file}_${f}_${order}_v1.xls" | 
    tee "${file}_${f}_avrg.xls" >> P-state-summary.xls

Использование echo -n или printf без "\ n" приведет к выводу текста без новой строки, поэтому выходные данные команды awk будут следовать за ней в той же строке. Я добавил пробел в качестве разделителя, но вы можете использовать что угодно.

Использование tee позволит вам записать выходные данные в отдельные файлы и сводный файл, используя только один вызов awk на входной файл (заказ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...