2017-08-30 5 views
1

ファイルから読み取った値を変数に渡し、別のファイルの列のすべての要素を変更するために、特にエントリをある数だけシフトするために使用します。列エントリに変数を追加するawk

データファイル "file_to_change"には、数値データの2つの列があり、1つは値がシフトされます。これと同じように:

-11.43465 

I電流は、次のコードを持っている:

file=tmp 
var1=$(awk 'NR==1' $file) 

echo $var1 

awk '{print ($1 - $var1) " " $2}' file_to_change 

echo $var1 

は私の結果は次のとおりです。

-1.643465E+01 1.378835E-03 
-1.642464E+01 1.242392E-03 
-1.641463E+01 1.147501E-03 
-1.640462E+01 1.083067E-03 
-1.639461E+01 1.042069E-03 
-1.638460E+01 1.020041E-03 
-1.637459E+01 1.014211E-03 

シフト値を含むファイル "tmpが" 単にこれです

-11.43465 
    0 1.378835E-03 
    0 1.242392E-03 
    0 1.147501E-03 
    0 1.083067E-03 
    0 1.042069E-03 
    0 1.020041E-03 
    0 1.014211E-03 
    -11.43465 

私はこれがプレット単純ですが、どこにエラーがあるのか​​わかりません!

+1

あなたがそのようなawkでシェル変数を使用することはできません( ' $ var1')。 'awk -v var1 =" $ var1 "'{... var1 ...' –

+0

あなたは変数をawkに次のようにシェルから渡すことができます: 'awk -v' var1あなたは変数をvar1ではなくvar1と呼んでいます) – Anonymous

答えて

0

他の人が述べたように、あなたは正しくはawkにシェル変数を渡していない:

結果がこれです。 awk本体の一重引用符は、シェル変数の拡張を妨げています。 awk本体の前後に二重引用符を使用すると、シェルはawkという変数を "$ 1"と "$ 2"に展開します。

あなたはこの引用混乱行うことができます:あなたが最初の列に0を取得する理由を説明するには

awk '{print ($1 - '"$var1"') " " $2}' file_to_change 

または非常にクリーン

awk -v var="$var1" '{print ($1 - var) " " $2}' file_to_change 

を:AWKで、未設定の変数であります空の文字列として扱われるか、数値コンテキストの場合は数字がゼロになります。 $var1があり、awk変数 "var1"が設定されていません。 $は、列番号の値を返す演算子の一種です。したがって、$ 1は最初の列の値、$ 2は2番目の列の値などです。そこで変数を使用することができます。x=14; print $x, $(x+1)は14番目と15番目の列を出力します。 var1変数が設定されていないので、表現$1 - $var1は(最初の行のために)なる$1 - $0次のようになります。

"-1.643465E+01" - "-1.643465E+01 1.378835E-03" 

awkは文字列と算術演算を行う場合は、最初の非数値文字と次の文字は単純に廃棄されます。証明するために:

$ awk 'BEGIN {print "10foo" - "7bar"}' 
3 
$ awk 'BEGIN {print "1e1foo" + "-700e-2bar"}' 
3 

をので、"-1.643465E+01" - "-1.643465E+01 1.378835E-03"
-1.643465E+01 - -1.643465E+01
なり、したがって0

これは、簡単に再現することができます。

$ seq 10 | paste - - | awk '{print $1 - $novar, $2}' 
0 2 
0 4 
0 6 
0 8 
0 10 
+0

私は書くつもりです。 'awk -v var =" $(

1

私が理解していれば、ファイル "file_to_change"の第1列のファイル "tmp"の値を差し引いてもよろしいですか?

awk 'NR==FNR{val=$0; nextfile} {$1-=val; print}' tmp file_to_change 

まず、我々はファイル「TMP」の最初の行から値を読み、次のファイルにスキップ:

一つの方法は、これがあります。

"file_to_change"の各行について、列1から値を減算して結果の行を出力します。

-5 1.378835E-03 
-4.98999 1.242392E-03 
-4.97998 1.147501E-03 
-4.96997 1.083067E-03 
-4.95996 1.042069E-03 
-4.94995 1.020041E-03 
-4.93994 1.014211E-03 
+0

'nextfile'はGNU awkに固有のことに注意してくださいawk –

関連する問題