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

问题描述 投票:0回答:2

我有多个文件(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
linux bash awk
2个回答
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
投票

我为您准备了以下双嵌套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

© www.soinside.com 2019 - 2024. All rights reserved.