在awk里面打印变量

时间:2009-12-01 11:14:29

标签: scripting awk printing

在这个脚本中,我希望awk打印变量$file$f$ordersum/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

Colud你们中的任何人都能帮助我吗?

2 个答案:

答案 0 :(得分:3)

awk没有出去为你获取shell变量,你必须将它们作为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看到它们之前的值),但是你必须开始转义{{1} } {symbol}和$命令中的各种其他内容:

awk

我更喜欢使用显式变量创建。

顺便说一下,您之前的相关问题here还有另一种解决方案可以解决。

答案 1 :(得分:1)

你可以这样做:

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 -nprintf而不使用“\ n”将输出没有换行符的文本,因此awk命令的输出将在同一行上跟随它。我添加了一个空格作为分隔符,但你可以使用任何东西。

使用tee将允许您使用每个输入(订单)文件只调用一次awk来将输出写入单个文件和摘要文件。