perl - 在通过 AWK 或任何其他方法处理第二个文件时,如何传递一个包含一个文件中的数据列表的数组?

标签 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

只要从一月到三月的列中的数据相同,此命令就可以正常工作,但是当数据不同时,由于map[$1]=$4,它会产生问题。也就是说,我只传递第四列的值。我想传递从一月到三月的所有值,然后与另一个文件中的相应值相乘。

我尝试了以下代码:

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

它发送整行,然后在内部分割它。 我还尝试将数组直接传递到 map :

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

这对我来说是有效的。

最佳答案

您的示例输入/输出有太多不相关的细节。我有一个简化的问题,您可以将其用于您的案例。

$ 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功能。

关于perl - 在通过 AWK 或任何其他方法处理第二个文件时,如何传递一个包含一个文件中的数据列表的数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39453901/

相关文章:

perl - 在 perl 中返回一个延迟计算的标量

regex - 使用 perl 的多个正则表达式

linux - 从 bash 脚本向 Mongo shell 传递命令,而不停止交互式 Mongo shell

c - "sh -c cmd"和 "cmd"之间的区别?

Bash-awk-大文件每一行的并行选择过程

regex - (ab)+ 有什么区别?和 (ab)+ 当我在 boost :regex? 中使用它时

linux - 从名称包含特定字符串的目录树中删除文件的最快方法

java - 需要帮助将批处理转换为 Shell

awk - 如何在 Bash 中使用 AWK 使用 2 个键提取值?

macos - 向 CSV 列添加分隔符