我用来达到此结果的命令如下:
awk -F"\t" '(FNR>1)&&(NR==FNR){map[$1]=$4; next}($1 in map){$3=substr($3,2); for(i=4;i<7;i++){$i=($i*map[$1])}; print $0}' file2.txt file1.txt
只要Jan到Mar中的列中的数据相同,此命令就可以正常工作,但是当数据不同时,由于map[$1]=$4
会产生问题。也就是说,我只传递第4列的价值。我想将所有值从Jan传递到Mar,然后在另一个文件中与相应的值相乘。
我尝试了以下代码:
awk -F"\t" '(FNR>1)&&(NR==FNR){{map[$1]=$0}; next}($1 in map){$3=substr($3,2); for(i=4;i<7;i++){split(map[$1],val);$i=($i*val[$i])}; print $0}' file2.txt file1.txt
发送整行,然后在内部拆分。 我也尝试将数组直接传递给地图:
awk -F"\t" '(FNR>1)&&(NR==FNR){split($0,val); for(i=4;i<7;i++){map[$1][$i]=val[$i]}; print map[$1][$i]; next}($1 in map){$3=substr($3,2); for(i=4;i<7;i++){$i=($i*(map[$1][$i]))}; print $0}' file2.txt file1.txt
我不介意使用任何其他方法来回答这个问题。我在想,无论如何在另一个awk命令中运行awk命令? 最终编辑:
awk -F"\t" '(FNR>1)&&(NR==FNR){map[$1]=$0; next}($1 in map){split(map[$1],temp);$3=substr($3,2); for(i=4;i<7;i++){$i=($i*temp[i])/12}; print $0}' file2.txt file1.txt
这就是我的情况。
答案 0 :(得分:2)
您的样本输入/输出有太多不相关的细节。我有一个简化的问题,你可以利用它。
$ head file{1,2}
==> file1 <==
1 10 20 30
2 11 21 31
3 12 22 32
==> file2 <==
1 6
2 7
3 8
$ awk 'NR==FNR{a[$1]=$0; next}
$1 in a{split(a[$1],v); print $1,$2,v[2]+v[3]+v[4]}' file1 file2
1 6 60
2 7 63
3 8 66
您缺少的成分未使用整个记录$0
和split
功能。