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

Linux 如何根据另一个文件中的相应值划分列?,linux,bash,awk,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

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

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

我为您准备了以下双嵌套
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}
无错误处理

$ 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
$headfile{1,2}.new | column-t
==>file1.new file2.new out
打印附加新列名的现有标题

v=$NF/a[FILENAME]
对于每个数据行,缩放最后一个字段并分配给
v

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

print>out
将新行打印到之前设置的同一文件中

info file1 file2
文件列表前应加上info file

无错误处理

$ 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
$headfile{1,2}.new | column-t
==>file1.new file2.new out
打印附加新列名的现有标题

v=$NF/a[FILENAME]
对于每个数据行,缩放最后一个字段并分配给
v

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

print>out
将新行打印到之前设置的同一文件中

info file1 file2
文件列表前应加上info file


我们的目标是添加一些自己的代码,以显示您自己为解决此问题所做的研究工作。我不知道如何将第二个文件包含到代码中,因此我没有初始代码可供使用。我是编码新手:(回到你得到的关于合并文件的答案:这个答案显示了如何包含第二个文件(使用
FNR==NR
)。目标是你添加一些自己的代码,以显示至少你自己为解决此问题所做的研究工作。我不知道如何将第二个文件包含到代码中,因此我没有初始代码可供使用。我是编码新手:(回到你得到的关于合并文件的答案:该答案显示了如何包含第二个文件。)(带
FNR==NR
)。我不确定这种方法什么时候有用。我不确定这种方法什么时候有用。谢谢Karakfa,但我有66个文件,所以有没有办法将其自动化,以便所有66个文件都在一个命令中运行?正如您在示例中所看到的,它们不是一个接一个地运行的。只要您将
信息
文件放在第一位,就可以列出n同一个命令,或者如果有一些公共名称/目录,请使用globs。例如
awk…info file{1,66}
将运行脚本所有66个文件,file1..file66似乎很棒!如果您能简单地解释一下您的命令,那将非常棒?工作正常,再次感谢Karakfa:)谢谢Karakfa,但我有66个文件,所以有没有办法将其自动化,以便所有66个文件都在一个命令中运行?正如您在示例中看到的,它们不是一个接一个地运行的。只要您将
info
文件放在第一位,您就可以在同一个命令上列出文件名,或者如果有一些通用名称/目录,请使用globs。例如
awk…Info文件{1,66}
将运行脚本所有66个文件,file1..file66看起来很棒!如果您能简单地解释一下您的命令,那就太棒了?效果很好,再次感谢Karakfa:)