Linux 如何根据另一个文件中的相应值划分列?
我有多个文件(66),希望将每个文件的第3列划分为info.file中相应的值,并在每个文件的第4列中插入新值。 我的手册代码是: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
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:)