如何使用awk命令删除文本文件中的单词"a"而不是字符'a'?



我试图使用awk '{$0 = tolower($0);gsub(/a|an|is|the/, "", $0);}' words.txt但它也取代了像白天这样的词。我只想删除单词a。

例如:
输入:白天是晴朗的,阳光明媚的是

预期输出:天晴

使用 GNU awk 和内置变量RT

$ echo this is a test and nothing more | 
awk '
BEGIN {
    RS="[ n]+"
    a["a"]
    a["an"]
    a["is"]
    a["the"]
}
(tolower($0) in a==0) {
    printf "%s%s",$0, RT
}'
this test and nothing more

但是,请发布一些具有预期输出的示例数据,以获取更具体的答案。

>您需要定义单词边界以消除部分匹配

$ echo "This is a sunny day, that is it." | 
  awk '{$0=tolower($0); gsub(/y(is|it|a|this)y/,"")}1' 

将打印

   sunny day, that  .
您也可以通过将标点符号

添加到字段分隔符或gsub单词来消除标点符号。

以下awk可能会对您有所帮助。

条件1st: 考虑到您只想在此处删除atheis之类的单词,您可以根据需要编辑我的代码并添加更多单词。

awk '{
    for(i=1;i<=NF;i++){
        if(tolower($i)=="a" || tolower($i)=="the" || tolower($i)=="is"){
            $i=""
        }
    };
}
1'  Input_file

条件 2nd:如果您想删除 atheis 等单词,并且还想从行中删除重复字段,那么以下内容可能会对您有所帮助(这是通过看到上面的注释中显示的示例输出来实现的(:

awk '{
    for(i=1;i<=NF;i++){
        if(tolower($i)=="a" || tolower($i)=="the" || tolower($i)=="is" || ++a[tolower($i)]>1){
            $i=""
        }
    };
}
1'   Input_file

注意:由于我正在使字段无效,因此我认为您很好,行之间几乎没有不适当的空间。

你需要一个表达式,其中单词由某些东西分隔(你需要决定什么分隔你的单词。例如,数字是分隔单词还是单词的一部分,例如 a4?因此,表达式可以是,例如,/[^:alphanum:](a|an|is|the)[^:alphanum:]/ .

但请注意,这些表达式将与单词 AND 分隔符匹配。使用捕获功能来处理此问题。

看起来您的"words.txt"每行只包含一个单词,因此表达式应由行的开头和结尾分隔,例如/^a$/

最新更新