用于处理 awk 中的点符号的单词边界



我有一个包含字符串的变量。 现在我想在awk中使用此变量来放置单词边界。我几乎可以做到,但工作界限对dot标志不起作用。如何处理这个问题。 我必须坚持使用awk因为我需要根据列采取一些进一步的行动。

输入变量:

echo $x
sam

输入数据:

cat foo
t1.sam sample
sam bla
sample sam

我得到的:

awk -v test="$x" '$1~"\<"test"\>"' foo
t1.sam sample
sam bla

grep -w给出所需的结果但无法使用,grep '<sam>' foo也有效,但相同的regexawk不起作用。

添加了示例:如果a != 1则打印所有行。 如果是a=1则检查$1是否包含SAM(带边界(,如果包含,则打印所有行。

a=1;
x=sam;
if [ $a -eq 1 ];then
    awk -v test="$x" '$1 == test' foo #Print all the lines where $1 is sam. 
 else
    awk -v test="$x" '$1 ~ /./' foo #print all the lines where $1 is something. 

fi

期望的输出:

a != 1

sam bla

a == 1

t1.sam sample
sam bla
sample sam

听起来你想创建一个可选的过滤器,像这样:

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
<</div> div class="one_answers">

DOT 不被视为单词字符,因此边界断言在.后不起作用

最好在这里使用相等:

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

相关内容

最新更新