Linux 如何使用awk命令删除单词";a「;不是字符';a';在文本文件中?

Linux 如何使用awk命令删除单词";a「;不是字符';a';在文本文件中?,linux,awk,command-line,Linux,Awk,Command Line,我试图使用awk'{$0=tolower($0);gsub(/a | an | is |/,“”,$0);}words.txt 但它也取代了day等词中的a。我只想删除a 例如: 输入:天气晴朗,阳光充足 预期输出:day sunny您需要一个表达式,其中单词由某物分隔(您需要确定单词的分隔符。例如,数字是单词的分隔符还是单词的一部分,例如a4?),因此表达式可以是,例如,/[^:alphanum:](a | an | is | the)[^:alphanum:///code> 但是请注意,这些

我试图使用awk'{$0=tolower($0);gsub(/a | an | is |/,“”,$0);}words.txt 但它也取代了day等词中的a。我只想删除a

例如:
输入:天气晴朗,阳光充足


预期输出:day sunny

您需要一个表达式,其中单词由某物分隔(您需要确定单词的分隔符。例如,数字是单词的分隔符还是单词的一部分,例如a4?),因此表达式可以是,例如,
/[^:alphanum:](a | an | is | the)[^:alphanum:///code>

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


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

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

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


看起来您的“words.txt”每行只包含一个单词,因此表达式应该由行的开头和结尾分隔,就像使用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

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

使用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
单词中来消除标点符号。

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

$ 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
可能会对您有所帮助

条件1:考虑到您只想删除像
a
这样的单词,您可以编辑我的代码,并根据需要添加更多单词

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

注意:因为我正在清空字段,所以我认为行与行之间没有不适当的空格是可以的。

下面的
awk
也可能对您有所帮助

条件1:考虑到您只想删除像
a
这样的单词,您可以编辑我的代码,并根据需要添加更多单词

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


注意:因为我正在清空字段,所以我认为行与行之间没有不适当的空格是可以的。

欢迎使用Stack overflow,您可以发布示例输入和预期输出吗?无论您想替换还是不想替换,请在代码标记中的帖子中提及,然后让我们知道。还有一个
a
不能是一个单词,是打字错误吗?你的意思是你只想删除一个单词中没有出现的字母?请告诉我们同样的情况。就像这句话“天是晴朗的”晴朗是“我只想输出“天是晴朗的”那么你想删除重复的字段吗?请确认一下。那么,“Sunny”这个词会发生什么变化?重复项是否已删除?欢迎来到Stack overflow,您可以发布示例输入和预期输出吗?无论您想在哪里进行替换,请在代码标签中的帖子中提及,然后让我们知道。而且单个
a
不能是一个单词,是一个拼写错误吗?您的意思是只想删除单个字母而不是单个字母吗输入单词?请在同一天让我们知道。就像这句话“天是晴朗的”我只想输出“天是晴朗的”,所以你想删除重复字段吗?请确认一次。那么,“晴朗”一词会发生什么情况?重复项是否已删除?它由空格分隔!@MingyangWang空格不是alphanum,因此给出的示例应该可以使用。如果希望空格作为唯一的分隔符,请repalce
[^:alphanum:]
with``它是由空格分隔的!@MingyangWang space不是alphanum,因此给出的示例应该可以使用。如果您希望将空格作为唯一的分隔符,请使用`like for this句子“the day is sunny the sunny is is”重新拼写
[^:alphanum:]
@MingyangWang,这样做的条件是什么?请提供您的要求更一般的方式,您的意思是要删除文件中每一行的is和一个字母
a
?是的,这正是我的意思,就像这句话“这一天是晴朗的,这一天是晴朗的”我只想输出“这一天是晴朗的”@明阳王,这样做的条件是什么?请以更一般的方式提供您的要求,您的意思是要删除文件中每一行的is和一个字母
a
?是的,这正是我的意思谢谢您的好代码先生,您能告诉我什么是
\y
,我也会感谢您。
\y
是单词边界,
\yword\y
将只匹配独立的“单词”,而不匹配“单词”或“剑”谢谢,先生,y为我工作。我以前试过作为边界,但没有用。再次非常感谢!感谢您的代码,先生,您能告诉我什么是
\y
,我也会感谢您。
\y
是单词边界,
\yword\y
只匹配独立的“单词”,而不是“单词”或“剑”谢谢,先生,y为我工作。我以前试过作为边界,但不起作用。再次非常感谢!哦,耶