2009-11-30 58 views
0

下面是完整的代码..识别错误的if语句

我想要做的就是这个 - >

我试图找到值在第二列的平均文件 。 如果该文件名称中有2.54,我想从文件file_2.54_even.xls和file_2.54_odd.xls中找到平均值。如果fiename名称中没有2.54,那么只需找到文件的平均值即可。例如:file_1.60.xls

#!/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 
    echo ${file}_${f}_even_v1.xls 
    awk 'sum+=$2 ;END {print "Average = " , $sum/NR > ${file}_${f}_avrg.xls }' ${file}_${f}_even_v1.xls 
    echo ${file}_${f}_odd_v1.xls 
    awk 'sum+=$2 ;END {print "Average = " , $sum/NR > ${file}_${f}_avrg.xls }' ${file}_${f}_odd_v1.xls 
else 
    echo ${file}_${f}_v1.xls 
    awk 'sum+=$2 ;END {print "Average = " , $sum/NR > ${file}_${f}_avrg.xls }' ${file}_{f}_v1.xls 
fi 
    done 
done 
+1

请发布您的平台的所有代码和详细信息;该示例在bash中运行良好,包括Cygwin和Ubuntu 9.10。 – paxdiablo 2009-12-01 00:20:14

+0

它适用于我这两个,再加上zsh,ksh和破折号。 – 2009-12-01 00:50:55

回答

1

因为您的awk命令在单引号内,所以shell变量filef不会被展开。这就是为什么你会得到awk错误。

我会用下面的脚本:

#!/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 
     flist=${file}_${f}_even_v1.xls ${file}_${f}_odd_v1.xls 
    else 
     flist=${file}_${f}_v1.xls 
    fi 
    cat ${flist} | awk ' 
     s+=$2; 
     END {print "Average = ",$s/NR} 
     ' >${file}_${f}_avrg.xls 
    # Or use awk '...' ${flist} >${file}_${f}_avrg.xls 
    # if you're overly concerned about efficiency of processes. 
    done 
done 

这将简单地设置flist要么两个文件或一个文件,这取决于f是否2.54与否,然后把文件的该列表通过一个单一的awk脚本。

+0

无用的'cat' - 'awk'会通过'$ flist'变量接受多个文件作为参数:'awk'...'$ {flist}> $ {file} ...' – 2009-12-01 12:08:54

+0

我知道它是在这种情况下无用,但与问题无关 - 您可能还抱怨缩进样式或多行awk脚本:-)我倾向于使所有管道都相同(从猫开始),因为并非全部命令允许你谈论的那种表现力。 – paxdiablo 2009-12-01 12:29:40

+0

PAxdiablo ..你已经击中了头部。恭喜 ! – 2009-12-01 19:59:30

1

我相信问题可能是你正在比较整数和字符串。

尝试

if [ $(f) -eq 2.54 ] 

虽然没有看到完整的代码,我看不出有什么行的错误是。

编辑:尝试在cygwin中,但我没有得到任何错误。

0

难道你不能移动重定向吗?

awk 'sum+=$2 ;END {print "Average = " , sum/NR }' ${file}_${f}_even_v1.xls > ${file}_${f}_avrg.xls