连接黑名单在CSV文件中用作AWK gsub正则表达式



我正在尝试使用脚本从CSV文件中的特定列中删除黑名单.txt文件中字符串的任何出现。

通过许多版本的试验和错误,我发现以下AWK正则表达式不匹配子字符串也能工作。

将以换行符分隔的txt文件转换为正则表达式:list="$(cat blacklist.txt | tr "n" "|" | sed 's/.$//')"

给出类似于这样的输出:already|also|although|always|am|among|amongst|amoungst|amount|an|and|another|any|anyhow|anyone|anything|anyway|anywhere

然后我尝试在awk替换命令中使用这个变量,使用"\<(word|word)>\ *"正则表达式格式以避免子字符串匹配。

内容如下:

awk -F, -v list=$list 'BEGIN{ re = "x22\\<("list")\\> *x22"} { gsub(re,"", $2);} 1 ' OFS=',' test.csv

这本身不起作用。但是,如果我打印由该命令生成的正则表达式:

awk -F, -v list=$list 'BEGIN{ re = "x22\\<("list")\\> *x22"} { gsub(re,"", $2); print re} 1 ' OFS=',' test.csv

我得到re的输出格式为:

"\<(a|about|above|across|after|afterwards|again|against|all|almost|alone|along|already|also|although|always|am|among|amongst|amoungst|amount|an|and|another|any|anyhow|anyone|anything|anyway|anywhere)\> *"

如果我复制这个并将其粘贴到awk命令中,替换gsub中的re变量,那么它就可以工作了!

我不明白为什么正则表达式不能作为变量工作,当变量的直接输出粘贴为正则表达式工作时。

<标题>样本CSV h1> 用变量的命令输出不正确
awk -F, -v list=$list 'BEGIN{ re = "x22\\<("list")\\> *x22"} { gsub(re,"", $2);} 1 ' OFS=',' test.csv
foobar,a house car,a foobar, foobar foobar
foobar,a house car,a foobar, foobar foobar
foobar,a house car,a foobar, foobar foobar
foobar,a house car,a foobar, foobar foobar

使用变量

内容的命令的正确输出
awk -F, -v list=$stop_word_list '{ gsub("\<(a|about|above|across|after|afterwards|again|against|all|almost|alone|along|already|also|although|always|am|among|amongst|amoungst|amount|an|and|another|any|anyhow|anyone|anything|anyway|anywhere)\> *","", $2);} 1 ' OFS=',' test.csv
foobar,house car,a foobar, foobar foobar
foobar,house car,a foobar, foobar foobar
foobar,house car,a foobar, foobar foobar
foobar,house car,a foobar, foobar foobar

请注意,'a'从第二列中消失了,而不是第三列,'car'中的a也不匹配。

请注意,blacklist.txt文件比我在这里提供的稍微长一些,并且我没有在黑名单单词中硬编码的选项,因为它们可能会被交换。

在OP的代码中,re = "x22...x22"在变量re中嵌入了实际的双引号,这反过来又告诉gsub()$2中查找实际的双引号。

虽然剥离x22可能会有所帮助,但我将选择一种稍微不同的方法…


gsub()调用中构建正则表达式的awk解决方案:

list='a|about|above|across|after'
awk -v list="${list}" 'BEGIN {FS=OFS=","} {gsub("\<("list")\> *","",$2)} 1' test.csv

由此产生:

foobar,house car,a foobar, foobar foobar
foobar,house car,a foobar, foobar foobar
foobar,house car,a foobar, foobar foobar
foobar,house car,a foobar, foobar foobar

如果OP在一些地方需要正则表达式,我们仍然可以用以下方式构建re变量:

awk -v list="${list}" 'BEGIN {FS=OFS=","; re="\<("list")\> *"} {gsub(re,"",$2)} 1' test.csv

也产生:

foobar,house car,a foobar, foobar foobar
foobar,house car,a foobar, foobar foobar
foobar,house car,a foobar, foobar foobar
foobar,house car,a foobar, foobar foobar

最新更新