Regex 在awk中处理点符号的单词边界

Regex 在awk中处理点符号的单词边界,regex,bash,awk,Regex,Bash,Awk,我有一个包含字符串的变量。现在我想在awk中使用这个变量来设置单词边界。我几乎能做到,但工作边界不适用于dotsign。如何处理这个问题。我必须坚持使用awk,因为我需要根据列采取一些进一步的措施 输入变量: 输入数据: 我得到的是: 期望输出: 当a!=1 sam bla t1.sam sample sam bla sample sam 当a==1 sam bla t1.sam sample sam bla sample sam 点不被视为单词字符,因此在 最好在这里使用平等: awk

我有一个包含字符串的变量。现在我想在
awk
中使用这个变量来设置单词边界。我几乎能做到,但工作边界不适用于
dot
sign。如何处理这个问题。我必须坚持使用
awk
,因为我需要根据列采取一些进一步的措施

输入变量: 输入数据: 我得到的是: 期望输出: 当
a!=1

sam bla
t1.sam sample
sam bla
sample sam
a==1

sam bla
t1.sam sample
sam bla
sample sam

点不被视为单词字符,因此在

最好在这里使用平等:

awk -v test="$x" '$1 == test' file
sam bla
编辑:根据您编辑的问题,您可以使用:

a=1
awk -v a=$a -v test="$x" '(a != 1 && $1 == test) || (a == 1 && $1 ~ test)' file
t1.sam sample
sam bla
sample sam

a=0
awk -v a=$a -v test="$x" '(a != 1 && $1 == test) || (a == 1 && $1 ~ test)' file
sam bla

听起来您想创建一个可选的过滤器,如下所示:

awk -v test="$test" 'length(test) && $1 == test || !length(test)' file
现在,如果shell变量
$test
为空,则会打印所有行。否则,仅显示第一个字段等于
$test
的行

使用您的文件:

$ test=sam
$ awk -v test="$test" 'length(test) && $1 == test || !length(test)' file
sam bla
$ test=
$ awk -v test="$test" 'length(test) && $1 == test || !length(test)' file
cat foo
t1.sam sample
sam bla
sample sam

我想知道,既然您已经使用了默认的
FS
@Kent,为什么不只使用
$1==“sam”或$1==test呢?不使用相等的原因是:有时test=,表示打印1美元包含任何内容的所有行,在等式中,如果只匹配由单词边界包围的一个字符,则这将不起作用。您不是在搜索过度复杂的方式,而是在搜索您的
,否则
块是多余的-其中$1是某物-
$1
始终是“某物”不使用相等的原因是:有时
test=。
,意味着打印
$1
包含任何内容的所有行,在平等的情况下,这将不起作用。你能在你的问题中用一个例子澄清一下吗?
被认为是一个单词边界,这正是为什么行
t1.sample
匹配的原因。对不起,我的意思是,
点不被认为是一个单词字符
我添加了一个例子,我想用更短的方式来做。在一个
awk
语句中。感谢您的帮助,我不得不稍微调整一下,为我工作。我正要删除我的答案,因为只需在shell中处理一次,然后在
else
分支中的
cat
文件,就更有意义了。老实说,我不明白您在问题中发布的示例有什么问题。我使用case语句和函数作为它们的选项,因此我必须将逻辑包装在一行中,以便可以将其插入case语句中。我想我没能把这个问题作为一个很好的例子。
awk -v test="$test" 'length(test) && $1 == test || !length(test)' file
$ test=sam
$ awk -v test="$test" 'length(test) && $1 == test || !length(test)' file
sam bla
$ test=
$ awk -v test="$test" 'length(test) && $1 == test || !length(test)' file
cat foo
t1.sam sample
sam bla
sample sam