Linux 如何使用awk命令删除单词";a「;不是字符';a';在文本文件中?
我试图使用awk'{$0=tolower($0);gsub(/a | an | is |/,“”,$0);}words.txt 但它也取代了day等词中的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> 但是请注意,这些
输入:天气晴朗,阳光充足
预期输出: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为我工作。我以前试过作为边界,但不起作用。再次非常感谢!哦,耶