在通过AWK或任何其他方法处理第二个文件时,我们如何通过一个文件传递数据列表?

时间:2016-09-12 15:30:03

标签: perl shell awk data-manipulation

我使用以下文件来达到以下结果: enter image description here

我用来达到此结果的命令如下:

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

这就是我的情况。

1 个答案:

答案 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

您缺少的成分未使用整个记录$0split功能。

相关问题