在awk中使用if语句检查一个变量是否符合格式,如果遵循,请遵循以下路径

时间:2019-03-06 10:11:16

标签: awk

如果内部数据为“ B”,我希望能够检查一个变量中包含的数据,然后如果包含其他内容,则使用此正则表达式使用其他正则表达式

awk '{if ($1 == "B")
($2 ~ /^".+"$/) && (length($2) <= 10)     {print "45th field invalid-HEADER-FILE";}
else
($2 ~ /^".+"|""$/) && (length($2) <= 10)   {print "45th field invalid-HEADER-FILE";}
'

样本输入

$1 == "B"
$2 == "random string"

预期产量

正则表达式传递时应该没有输出

替代样本输入

$1 == "B"
$2 == "null/empty

预期产量

屏幕上应该显示45th field invalid-HEADER-FILE

2 个答案:

答案 0 :(得分:1)

更新
条件可以组合:
($45 ~ /^".+"$/) && (length($45) <= 2502)($45~/^".{1,2500}"$/)
($45 ~ /^".+"|""$/) && (length($45) <= 2502)($45~/^".{0,2500}"$/)

此外,如果引号内没有引号(应该这样),则更准确地说: ($45~/^"[^"]{1,2500}"$/)($45~/^"[^"]{0,2500}"$/)
因此,您可以像这样进行检查:

awk '
    $44 == "B" && ($45~/^"[^"]{1,2500}"$/) {print "45th field invalid-HEADER-FILE";}  # <-- You can add next inside, after the semicolon, if there are no other codes need to execute.
    $44 != "B" && ($45~/^"[^"]{0,2500}"$/) {print "45th field invalid-HEADER-FILE";}
'

由于它完全相等或不相等,因此AND$44 == "B"与其他条件不同的条件就可以满足您的需求。

或者,将它们全部放入主块中,并正确引用它们,如下所示:

$44 != "B"

正确引用和缩进后,您可以清楚地看到结构。

顺便说一句,为简明起见,您可以将awk ' { if ($44 == "B") { if ($45~/^"[^"]{1,2500}"$/) { print "45th field invalid-HEADER-FILE"; } } else { if ($45~/^"[^"]{0,2500}"$/) { print "45th field invalid-HEADER-FILE"; } } }' 更改为length($45) <= 2502,因为length($45) < 2503返回一个整数。

答案 1 :(得分:1)

我真的希望您发布一些示例数据,而不是发布45个字段,每个字段中包含2502个字符。发布具有2个字段的样本,并将宽度减小到合理的范围,例如3:

$ cat file
A ""
A "123"
A "1234"
B ""
B "123"
B "1234"

脚本:

$ awk '$1=="B" && $2~/^".{,3}"$/{print $0}' file

及其输出(这些应该是您的失败消息,但仅用于演示目的):

B ""
B "123"

这将大致翻译为:

$ awk '$44=="B" && $45~/^".{,2500}"$/{print "45th field invalid-HEADER-FILE"}' file

这是您想要的吗?