【问题标题】:replace terms with associated abbreviations from other file, in case of matching在匹配的情况下,用其他文件中的相关缩写替换术语
【发布时间】:2017-07-11 02:03:47
【问题描述】:

我有两个文件:
1. 图案文件 = pattern.txt
2.包含不同术语的文件=terms.txt

pattern.txt 包含两列,以;分隔
在第一列中我有几个术语,在第二列中是缩写,
关联到第一列,同一行。

terms.txt 包含单个单词和由单个单词定义的术语,但也包含
通过单词的组合。

pattern.txt

Berlin;Brln
Barcelona;Barcln
Checkpoint Charly;ChckpntChrl
Friedrichstrasse;Fridrchstr
Hall of Barcelona;HllOfBarcln
Paris;Prs
Yesterday;Ystrdy

terms.txt

Berlin  
The Berlinale ended yesterday  
Checkpoint Charly is still in Friedrichstrasse  
There will be a fiesta in the Hall of Barcelona  
Paris is a very nice city 

目标是用标准化缩写替换术语并找出哪些术语
没有缩写。
结果我想要两个文件。
第一个文件是一个新的术语文件,术语替换为可以替换的缩写词。
第二个文件包含一个列表,其中包含所有没有缩写的术语。
输出不区分大小写,我不区分“The”和“the”。

new_terms.txt

Brln  
The Berlinale ended Ystrdy  
ChckpntChrl is still in Fridrchstr  
There will be a fiesta in the HllOfBarcln  
Prs is a very nice city  

terms_without_abbreviations.txt

a  
be  
Berlinale  
city  
ended  
fiesta  
in  
is  
nice  
of  
still  
The  
There  
very  
will  

感谢您的帮助,并提前感谢您的时间和提示!

【问题讨论】:

  • 您为自己尝试了什么?在此处发布您的尝试。
  • 我每年只使用几次终端,但我不是很有经验。试过 link 但不符合我的情况。
  • 您必须记住,如果您发布您的尝试但失败(这不是问题),SO 社区会帮助您,以便我们可以帮助您。人们不能只为您编写免费代码。没有不尊重的意思!
  • 因为我非常尊重这个论坛的知识,所以在这里寻求帮助。我尝试了几次,但无法解决问题。提到一次尝试,我可以替换一些术语,问题是我得到的结果只是缩写。 awk -F";" 'NR==FNR{a[$1]=$2;next}{$1=a[$1];}1' pattern.txt terms.txt > new_terms.txt
  • 好吧,这两个文件中都没有空格会不会很痛苦,即Checkpoint CharlyCheckpoint-Charly,你可以控制这些文件还是不可能?

标签: macos unix awk terminal


【解决方案1】:

这主要是你需要的:

BEGIN { FS=";"; }
FNR==NR { dict[tolower($1)] = $2; next }
{
    line = "";
    count = split($0, words, / +/);
    for (i = 1; i <= count; i++) {
        key = tolower(words[i]);
        if (key in dict) {
            words[i] = dict[key];
        } else {
            result[key] = words[i];
        }
        line = line " " words[i];
    }
    print substr(line, 2);
}
END {
    count = asorti(result, sorted);
    for (i = 1; i <= count; i++) {
        print result[sorted[i]];
    }
}

【讨论】:

  • 谢谢迈克尔!效果很好。
【解决方案2】:

好的,所以我有一点点破绽,但会解释问题:

  1. 如果您在 pattern.txt 中有多个可能与单行相关的更改,则第一个更改将进行更改,而第二个更改不会更改(例如,巴塞罗那;Barcln 和巴塞罗那大厅;HllOfBarcln,显然如果 Barcln 已经当您获得更长的版本时已完成,它将不再存在,因此没有进行任何更改)
  2. 与上面类似,“Hall”这个词没有缩写,所以如果我们假设上面是正确的并且只进行了第一次更改,那么您的新更改文件将包含 hall 没有缩写

#!/usr/bin/awk -f

BEGIN{
    FS = ";"

    IGNORECASE = 1
}

FNR == NR{
    abbr[tolower($1)] = $2
    next
}

FNR == 1{ FS = " " }

{
    for(i = 1; i <= NF; i++){
        item = tolower($i)
        if(!(item in abbr) && !(item in twa)){
            twa[item]
            print item > "terms_without_abbreviations.txt"
        }
    }

    for(i in abbr)
        gsub("\\<"i"\\>", abbr[i])

    print > "new_terms.txt"

}

可能还有其他问题需要寻找,但这是一个模糊的方向。不知道你会如何绕过我上面的观点??

【讨论】:

  • 非常感谢!两种解决方案都对我有用!你和迈克尔斯。我正在测试很多示例,并且我立即理解了您的方法,但一开始并没有奏效。在决定使用gawk 之后,效果非常好!你的假设是对的,我也不得不面对这些问题。该术语始终位于第一列。到目前为止,terms.txt 中出现的这个词应该被替换掉。在第一次尝试中使用awk,我没有得到预期的结果,但这对我来说是合乎逻辑的,所以我尝试使用gawk,然后我得到了预期的结果。非常感谢你,我确实从你那里学到了很多东西!
猜你喜欢
  • 1970-01-01
  • 2015-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-26
  • 1970-01-01
  • 2015-01-09
相关资源
最近更新 更多