1

すべてのディレクトリを検索し、必要なデータをファイルから抽出する 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 ...」という行が正しく機能せず、最初の列に間違った数値が返されます。これは反復ごとに異なる定数シフトであるため、次の説明と同じロジックに従う必要があります。列から定数を減算する方法です が、明らかに $EFERMI 値を区別できません。各ディレクトリに移動せずに手動で awk コマンドを個別に実行する方法はありますか?!

前もって感謝します

4

1 に答える 1

2

それ以外の:

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

使用する:

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

これは、シェル変数を awk に渡す適切な方法です。

awk コマンド$EFERMIは一重引用符で囲まれているため、シェルはその値を展開しません。

于 2013-11-06T13:42:52.913 に答える