我试图使用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:
考虑到您只想在此处删除a
,the
和is
之类的单词,您可以根据需要编辑我的代码并添加更多单词。
awk '{
for(i=1;i<=NF;i++){
if(tolower($i)=="a" || tolower($i)=="the" || tolower($i)=="is"){
$i=""
}
};
}
1' Input_file
条件 2nd:如果您想删除 a
、the
和 is
等单词,并且还想从行中删除重复字段,那么以下内容可能会对您有所帮助(这是通过看到上面的注释中显示的示例输出来实现的(:
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$/