如何根据另一个文件中的相应值划分列?

时间:2017-12-19 08:32:44

标签: linux bash awk

我有多个文件(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

输出:

 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 个答案:

答案 0 :(得分:3)

没有错误处理

$ 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

将生成更新的文件

$ 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}扫描第一个文件并将文件/值对保存在关联数组

中      每个数据文件标题行中的

FNR==1

     

out=FILENAME".new"设置输出文件名

     

print $0, "new_value" > out打印附加了新列名称的现有标题

     每个数据行

v=$NF/a[FILENAME],缩放最后一个字段并分配给v

     

$++NF=v增加字段数,并将新计算值分配给最后一个字段

     

print > out将新行打印到

之前的同一文件集中      

info file1 file2文件列表前面应该有info文件

答案 1 :(得分:1)

我为您准备了以下双嵌套awk命令:

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

div_column3.awk是awk命令脚本文件,内容为:

$ cat div_column3.awk
NR==1{print $0" new_value"}NR>1{print $0" "$3/div}

output