如果内部数据为“ 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
答案 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
这是您想要的吗?