我有一个包含字符串的变量。 现在我想在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
也有效,但相同的regex
在awk
不起作用。
添加了示例:如果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