gpt4 book ai didi

arrays - awk 查找表,空列替换

转载 作者:行者123 更新时间:2023-12-04 07:52:26 24 4
gpt4 key购买 nike

我正在尝试使用查找表来搜索和替换两个特定列,并不断获得一个空白列作为输出。我已经遵循了我在堆栈中找到的几个查找表示例的语法,但并不高兴。这是每个文件的片段。
示例查找表——想要在我的数据文件中搜索第 1 列的实例并将它们替换为第 2 列中的相应值(第一行是标题):

 #xyz   type
N 400
C13 401
13A 402
13B 402
13C 402
C14 405
要替换的源文件具有以下格式:
 1  N      0.293000    2.545000   16.605000     0     2     6    10    14
2 C13 0.197000 2.816000 15.141000 0 1
3 13A 1.173000 2.887000 14.676000 0
4 13B -0.319000 3.756000 14.937000 0
5 13C -0.351000 1.998000 14.678000 0
6 C14 0.749000 3.776000 17.277000 0 1
查找表第 2 列中的相应值将替换我的源文件第 6 列中的值(当前全为零)。这是我认为应该工作的 awk one-liner:
awk -v OFS='\t' 'NR==1 { next } FNR==NR { a[$1]=$2; next } $2 in a { $6=a[$1] }1' lookup.txt source.txt
但我的输出基本上删除了第 6 列的整个条目:
1   N     0.293000  2.545000    16.605000       2   6   10  14
2 C13 0.197000 2.816000 15.141000 1
3 13A 1.173000 2.887000 14.676000
4 13B -0.319000 3.756000 14.937000
5 13C -0.351000 1.998000 14.678000
6 C14 0.749000 3.776000 17.277000 1
(第六列应该是 400 到 405。我考虑使用 sed,但是我的查找表的源列和输出列中有重复的值,所以在这种情况下不起作用。令人沮丧的是我有这个 - liner 在前一周处理几乎完全相同的源文件,但现在只能得到这种行为。我希望能够修改我的 awk 调用以同时查找两个不同的列,但现在想从简单开始。谢谢!

最佳答案

您有 $6=a[$1]而不是 $6=a[$2]在你的脚本中。

$ awk -v OFS='\t' 'NR==FNR{map[$1]=$2; next} {$6=map[$2]} 1' file1 file2
1 N 0.293000 2.545000 16.605000 400 2 6 10 14
2 C13 0.197000 2.816000 15.141000 401 1
3 13A 1.173000 2.887000 14.676000 402
4 13B -0.319000 3.756000 14.937000 402
5 13C -0.351000 1.998000 14.678000 402
6 C14 0.749000 3.776000 17.277000 405 1

关于arrays - awk 查找表,空列替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66890258/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com