awk列减去常量

时间:2013-11-06 13:41:25

标签: linux bash awk

我写了一个bash脚本,它搜索我的所有目录并从文件中提取我需要的一些数据。一切正常,直到我想用每个目录中正在改变的常量减去我的文件的第一列。代码如下:

#!/bin/bash
ROOT=$(pwd)
#DIRS=$(find -name "*99")
DIRS[1]=99
DIRS[2]=199
DIRS[3]=299
DIRS[4]=399
DIRS[5]=499
DIRS[6]=599
DIRS[7]=699
DIRS[8]=799
DIRS[9]=899
DIRS[10]=999

for DIR in 1 2 3 4 5 6 7 8 9 10
  do
    dir=${DIRS[${DIR}]}
    cd $dir

CDIR=$(pwd)
if [ $CDIR = $ROOT ]; then
    continue
fi

#echo $CDIR

EFERMI=$(grep "E-fermi" OUTCAR | tail -n 1 | awk '{print $3}')
echo $EFERMI

# DOS
head -n 3007 DOSCAR | tail -n 3001 > DOS

cat DOS | awk '{print $1-$EFERMI , ($2+$3)/32}' > shifted_DOS_$dir
cat DOS | awk '{print $1 , ($2+$3)/32}' > nshifted_DOS_$dir
cp shifted_DOS_$dir  $ROOT"/PLOTS"
cp nshifted_DOS_$dir $ROOT"/PLOTS"
cd $ROOT
done

这条线     “awk'{print $ 1- $ EFERMI ...” 没有正常工作,它为第一列提供了错误的数字。它是一个恒定的移位,在每次迭代中都是不同的,所以它应该遵循相同的逻辑:how to subtract a constant number from a column 但显然它无法区分$ EFERMI值。知道怎么做而不去每个目录并单独手动执行awk命令吗?!

提前致谢

1 个答案:

答案 0 :(得分:2)

而不是:

awk '{print $1-$EFERMI , ($2+$3)/32}' 

使用:

awk -v EFERMI=$EFERMI '{print ($1-EFERMI), ($2+$3)/32}'

这是将shell变量传递给awk的正确方法。

在你的awk命令中$EFERMI在单引号内,因此shell不会扩展它的值。