2017-09-06 69 views
0

我想和查找值在另一个主文件中的文件来替换值我目前使用下面的命令查找和从值文件替换主文件

awk 'FNR==NR { array[$1]=$2; next } { for (i in array) gsub(i, array[i]) }1' map.txt test1.txt 

猫的map.txt

NOT NULL

猫的test.txt

CHARACTER SET LATIN NOT CASESPECIFIC NOT NULL

结果:

CHARACTER SET LATIN NOT NULL CASESPECIFIC NULL

它工作正常的进行更换单个单词。

但是,当我给多个单词,引号里说

猫的map.txt

'NOT NULL' 'NULL'

预期输出:

字符集拉丁不是CASEPULL NULL NULL

这是行不通的,如果我必须替换多个单词组合。

任何帮助在这里将不胜感激。

在此先感谢。

+0

必须引用吗? map.txt中的替换集是否都相等?这意味着有两个词作为一个词的索引。 – JFS31

+0

[编辑]你的问题使用'{}'按钮来正确地格式化你的输入和输出,所以我们有我们可以复制/粘贴的东西来测试。 –

回答

0

所以如果你生活中可以没有引用的文字和的map.txt文件查找,你可以做这样的事情全部更换相同:

aawk 'FNR==NR{ array[$1]=$2; next } { for (i in array) gsub(i, array[i]) }1' FS=":" map.txt FS=" " test.txt 

猫的test.txt

CHARACTER SET LATIN NOT CASESPECIFIC NOT NULL 

猫图.TXT

NOT NULL : NULL 

输出:

CHARACTER SET LATIN NOT CASESPECIFIC NULL 

还有一句:

猫的test.txt

CHARACTER SET LATIN NOT CASESPECIFIC NOT NULL 

猫图。TXT

SET LATIN NOT CASESPECIFIC NOT : NULL 

输出:

CHARACTER NULL NULL 

你必须做出的调整是将地图文件通过分离这两个领域(目标进行更换,更换)通过:(或其他任何东西,只是改变它在脚本中)。如果你这样做,它会使脚本保持低复杂度,但现在工作很重要,你要替换多少字。

+0

这没有给我所需的输出。 它所做的是将'NOT'替换为'NULL'。 我需要的是用'NULL'替换'NOT NULL' –

+0

还有其他建议吗? 我试过用引号,它不工作。 –

+0

Mhhh,这很奇怪。因此,如果使用test.txt和map.txt作为发布,它将用NULL替换NOT NULL。但是没有使用引号。 – JFS31