从主文件中的值查找和替换文件
Posted
技术标签:
【中文标题】从主文件中的值查找和替换文件【英文标题】:Find and replace in file from values in master file 【发布时间】:2018-02-14 14:54:47 【问题描述】:我想用另一个主文件中的查找值替换文件中的值
我目前正在使用以下命令来做到这一点
awk 'FNR==NR array[$1]=$2; next for (i in array) gsub(i, array[i]) 1' map.txt test1.txt
猫地图.txt
非空
猫测试.txt
字符集拉丁语不区分大小写不为空
结果:
CHARACTER SET LATIN NOT CASESPECIFIC NULL NULL
替换单个单词效果很好。
但是当我在引号内给出多个单词时说
猫地图.txt
'非空''空'
预期输出:
CHARACTER SET LATIN NOT CASESPECIFIC NULL
如果我必须替换多个组合的单词,它就不起作用了。
如有任何帮助,我们将不胜感激。
提前致谢。
【问题讨论】:
必须引用吗? map.txt 中的替换集是否都相等?这意味着有两个词作为一个词的索引。 edit 您的问题是使用
按钮正确格式化您的输入和输出,以便我们可以复制/粘贴来测试。
【参考方案1】:
因此,如果您可以在不引用单词的情况下生活,并且 map.txt 文件对于所有替换项看起来都相同,您可以执行以下操作:
aawk 'FNR==NR array[$1]=$2; next for (i in array) gsub(i, array[i]) 1' FS=":" map.txt FS=" " test.txt
猫测试.txt
CHARACTER SET LATIN NOT CASESPECIFIC NOT NULL
猫地图.txt
NOT NULL : NULL
输出:
CHARACTER SET LATIN NOT CASESPECIFIC NULL
另一个:
猫测试.txt
CHARACTER SET LATIN NOT CASESPECIFIC NOT NULL
猫地图.txt
SET LATIN NOT CASESPECIFIC NOT : NULL
输出:
CHARACTER NULL NULL
您必须对地图文件进行调整,方法是将两个字段(替换目标、替换)分隔为:(或其他任何内容,只需在脚本中更改即可)。如果你这样做,它会使脚本保持低复杂度,但现在不管你想替换多少个单词都可以工作。
【讨论】:
这没有给我想要的输出。它所做的是将 'NOT' 替换为 'NULL' 。我需要的是用'NULL'替换'NOT NULL' 还有其他建议吗?我也尝试过使用引号,它不起作用。 嗯,这很奇怪。因此,如果使用发布的 test.txt 和 map.txt,它会将 NOT NULL 替换为 NULL。但不适用于引号。 当我按照您的建议或使用引号时,它不会将 NOT NULL 替换为 NULL。我所需要的只是将多个当前不起作用的单词一起替换。 嗯,所以构造 array[$1 FS $2]=$3; next 捕获 NOT NULL 作为值 NOT 的键。因此,当它在数组上循环时,它会在 test.txt 中看到 Key NOT NULL 并使用为 NULL 的值对其进行 gsubs。或者我在这里遗漏了一些东西......*抓挠我的头*以上是关于从主文件中的值查找和替换文件的主要内容,如果未能解决你的问题,请参考以下文章