【问题标题】:printing variable inside awk在 awk 中打印变量
【发布时间】:2009-12-01 20:30:34
【问题描述】:

在这个脚本中,我希望 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

请你们中的任何人帮我解决这个问题?

【问题讨论】:

    标签: scripting awk printing


    【解决方案1】:

    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 看到它们之前的值),但是你必须开始转义$ 符号和各种awk 命令中的其他内容:

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

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

    顺便说一句,对于您之前的相关问题here,还有另一个解决方案应该可以解决。

    【讨论】:

      【解决方案2】:

      你可以这样做:

      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
      

      使用不带“\n”的echo -nprintf 将输出不带换行符的文本,因此awk 命令的输出将跟随在同一行。我添加了一个空格作为分隔符,但你可以使用任何东西。

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

      【讨论】:

        猜你喜欢
        • 2010-12-22
        • 2018-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-21
        • 2014-05-13
        • 1970-01-01
        • 2015-03-31
        相关资源
        最近更新 更多