2017-12-19 18 views
0

私は複数のファイル(66)を持ち、各ファイルの3列目をinfo.fileの対応する値に分割し、各ファイルの4列目に新しい値を挿入します。 私のマニュアルのコードは次のとおりです。別のファイルの対応する値に基づいて列を分割する方法はありますか?

awk '{print $4=$3/NUmber from info.file}1' file 

しかし、これは、個々のファイルに対して行うために私に時間を要します。だから私はすべてのファイルのためにそれを自動化したい。おかげ

file1: 
chrm name value 
4  a  8 
3  b  4 

file2: 
chrm name value 
3  g  6  
5  s  12  

info.file: 
file_name average 
file1   8 
file2   6 
file3   10 

は出力:div_column3.awkは、コンテンツとawkコマンドスクリプトファイルであることを

awk 'NR>1{system("awk -v div="$2" -f div_column3.awk "$1" | column -t > new_"$1);}' info.file 

file1: 
chrm name value new_value 
4  a  8  1 
3  b  4  0.5 

file2: 
chrm name value new_value 
3  g  6  1 
5  s  12  2 
+2

目標は、自分で解決するための研究努力を少なくとも示すために自分のコードを追加することです。 – Cyrus

+0

私はコードに2番目のファイルを含める方法を知らないので、最初のコードを再生する必要があります。私は新しいコーディングで:( – Behmah

+1

ファイルをマージするための答えに戻る:https://stackoverflow.com/questions/46345345/how-to-merge-two-files-with-different-fields-based-on- one-matching-columnsその答えは、2番目のファイル( 'FNR == NR')の使用方法を示しています。 – jas

答えて

1

私はあなたのために、以下の二重の入れ子になったawkコマンドを用意しています

$ cat div_column3.awk 
NR==1{print $0" new_value"}NR>1{print $0" "$3/div} 
生成されます

$ awk 'NR==FNR {a[$1]=$2; next} 
     FNR==1 {out=FILENAME".new"; print $0, "new_value" > out; next} 
       {v=$NF/a[FILENAME]; $++NF=v; print > out}' info file1 file2 

ハンドリングエラーなし

output

+0

このアプローチが有用なのはいつか分かりません。 – karakfa

3

、更新されたファイル

$ head file{1,2}.new | column -t 

==> file1.new <== 
chrm name  value new_value 
4  a   8  1 
3  b   4  0.5 

==> file2.new <== 
chrm name  value new_value 
3  g   6  1 
5  s   12  2 

説明

NR==FNR {a[$1]=$2; next}は、最初のフィルをスキャンe及び各データファイル

out=FILENAME".new"のヘッダ行に連想配列

FNR==1でファイル/値のペアを保存

print $0, "new_value" > outプリント既存のヘッダが新しい列名を付加し、出力ファイル名を設定

v=$NF/a[FILENAME]すべてのデータラインのために、最後のフィールドを拡張し、v

に割り当てますインクリメントフィールドの数と最後のフィールドに新しい計算された値を代入

print > out印刷ファイルのリストは、情報が先行されなければならない

info file1 file2前に設定された同じファイルに新しい行ファイル

+0

Karakfaありがとうございますが、私は66のファイルを持っていますので、66のファイルがすべて1つのコマンドで実行されるように自動化する方法はありますか? – Behmah

+0

この例のように、1つずつ実行されるわけではありません。 'info'ファイルを最初に置く限り、同じコマンドでファイル名をリストすることもできますし、いくつかの共通名/ディレクトリにglobを使用することもできます。たとえば 'awk ... info file {1,66}'は66個すべてのファイルfile1..file66を実行します。 – karakfa

+0

ありがとう、私はそれに行くでしょう:) – Behmah

関連する問題