Dictionary Awk在gsub中访问字典

Dictionary Awk在gsub中访问字典,dictionary,awk,replace,Dictionary,Awk,Replace,我有下一个代码,我想访问与我在BEGIN块中创建的字典d中类似([0-9]+)的文本中匹配的位置“\1”。 问题是在gensub中,d[“\1”]]逐字打印,而不是字典中的单词 我怎样才能做到呢 awk 'BEGIN { while (getline < "dictionary") d["(("i++"))"]=$0 } { for (i=1; i<=NF; i++) $i=tolower($i) } { print gensub(/(\(\([0-9]+\)\))

我有下一个代码,我想访问与我在
BEGIN
块中创建的字典d中类似([0-9]+)的文本中匹配的位置“\1”。 问题是在
gensub
中,d[“\1”]]逐字打印,而不是字典中的单词

我怎样才能做到呢

awk 'BEGIN {
  while (getline < "dictionary")
     d["(("i++"))"]=$0
}
{
for (i=1; i<=NF; i++)
  $i=tolower($i)
}
{
print gensub(/(\(\([0-9]+\)\))/, d["\\1"], "g")
}' fileToReplace.log
字典示例:

UK
Dublin
Madrid
Ireland
预计产量为:

|||

I want to go to d'Dublin from UK

I want to go

To d'UK

From Ireland

|||
基本上,我需要的是匹配任意排列组合中的数字,并将此组合(所有排列组合和数字)替换为其在字典中的相应位置

在调用
gensub()
之前以及在
“\\1”之前对
d[“\\1”]
进行评估
除了文字字符串之外,还有其他含义,当然不是反向引用扩展。看:

$ echo 'aBc' | awk '{d["B"]="X"; sub(/B/,d["&"])}1'
ac

$ echo 'aBc' | awk '{d["&"]="X"; sub(/B/,d["&"])}1'
aXc
你想要这样的东西:

$ cat tst.awk
NR==FNR { d[NR]=$0; next }
{
    head = ""
    tail = tolower($0)
    while ( match(tail,/\(+[0-9]+\)+/) ) {
        trgt = substr(tail,RSTART,RLENGTH)
        gsub(/[()]/,"",trgt)
        head = head substr(tail,1,RSTART-1) d[trgt]
        tail = substr(tail,RSTART+RLENGTH)
    }
    print head tail
}

$ awk -f tst.awk dictionary fileToReplace.log
|||

i want to go to d'Dublin from UK

i want to go

to d'UK

from Ireland

|||

它工作得很好!唯一的问题是我想匹配括号内的数字。示例:from((158))获取158,而不是所有单词。这是因为在文本中有类似((158)的词和其他类似((158))的词我想我知道你的意思,所以我编辑了我的答案。如果不是这样,那么编辑你的问题,包括一些简明的、可测试的、样本输入和预期的输出。你是对的!我编辑了出版物,所以现在它有一个例子。谢谢!现在它更令人困惑了,因为我看不到字典顺序和我输入的数字之间的相关性在你的另一个文件中,你有一些不匹配参数的情况,如果它们应该与字典值匹配或不匹配,则idk-再次编辑你的问题,以包含给定这两个输入文件的预期输出,并解释这些字典项中的任何项如何获得值,例如。好吧!我认为最好解释为否W
$ cat tst.awk
NR==FNR { d[NR]=$0; next }
{
    head = ""
    tail = tolower($0)
    while ( match(tail,/\(+[0-9]+\)+/) ) {
        trgt = substr(tail,RSTART,RLENGTH)
        gsub(/[()]/,"",trgt)
        head = head substr(tail,1,RSTART-1) d[trgt]
        tail = substr(tail,RSTART+RLENGTH)
    }
    print head tail
}

$ awk -f tst.awk dictionary fileToReplace.log
|||

i want to go to d'Dublin from UK

i want to go

to d'UK

from Ireland

|||