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