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 查找表,空白列替换的主要内容,如果未能解决你的问题,请参考以下文章

awk查找指定行指定列的数据 并输出到文件

用上面单元格中的值查找并替换空白值[重复]

如果 A 列中的单元格为空白,则针对不同工作表中的数据集查找 B 列

MS Access 在多个表的列字段中查找和替换文本

Power Query 自定义列查找和替换

在 MySQL 中用另一个表查找和替换表数据