linux - awk 列减去一个常量

标签 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 命令的情况下执行此操作吗?!

提前致谢

最佳答案

代替:

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

使用:

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

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

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

关于linux - awk 列减去一个常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19813656/

相关文章:

用于按列名称搜索文件(.csv)的linux cmd

linux - 提取节点 IP 而不解析 ifconfig 的输出

linux - SED 替换为斜线和单词

linux - 如何使用 grep 命令搜索多个模式?

c - Linux C 编程

regex - Grep 具有最大字符数的行

bash - 在 bash 中转换字符串 - 在参数周围添加括号

linux - 无法在linux mint上安装vpython

regex - 对可选捕获子表达式的模式反向引用

linux - 如何退出从 bash 脚本创建的 ssh session ?