awk 查找表,空白列替换
Posted
技术标签:
【中文标题】awk 查找表,空白列替换【英文标题】:awk lookup table, blank column replacement 【发布时间】:2021-06-27 14:38:44 【问题描述】:我正在尝试使用查找表来搜索和替换两个特定列,并不断得到一个空白列作为输出。我遵循了我在堆栈上找到的几个查找表示例的语法,但并不高兴。这是每个文件的 sn-p。
示例查找表 -- 想要在我的数据文件中搜索第 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 单行代码:
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,但我的查找表的源和输出列中有重复值,所以在这种情况下不起作用。令人沮丧的是我有这个单线器在前一周几乎完全相同的源文件上工作,但现在只能得到这种行为。我希望能够修改我的 awk 调用以同时查找两个不同的列,但想从简单的开始暂时。谢谢!
【问题讨论】:
【参考方案1】:您的脚本中有 $6=a[$1]
而不是 $6=a[$2]
。
$ awk -v OFS='\t' 'NR==FNRmap[$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
【讨论】:
我知道这是我缺少的一些小东西——非常感谢,Ed!应该从我看过的其他几篇解释如何使用查找表的帖子中了解这些细节。以上是关于awk 查找表,空白列替换的主要内容,如果未能解决你的问题,请参考以下文章