Глядя на ваш сценарий, кажется, что это немного неловко.Давайте переведем то, что вы сделали.
Примечание: Я предполагаю, что вы позвонили в awk с awk -F, -f file.awk inputfile
$3 ~ expr
: Эта строка пытается сопоставить поле 3 с расширенным регулярным выражением, представленным expr
. ($2 == "\"[ABCDEFGUHIJKLMNOPQRSTUVWXYZ]\"" ? "^\"[[:digit:]]\"$" : "\"\"$")
: Используемое выражение expr
в приведенном выше ERE является троичной операцией: $2 == "\"[ABCDEFGUHIJKLMNOPQRSTUVWXYZ]\""
: если поле 2 равно строка "[ABCDEFGUHIJKLMNOPQRSTUVWXYZ]"
, то ^\"[[:digit:]]\"$"
: поле совпадения 3к ERE ^"[[:digit:]]"$
, в противном случае "\"\"$"
: в противном случае соответствует пустой строке ""
.
Проблемалежит в условном выражении троичного оператора, который должен быть $2 ~ /"[A-Z]"/
вместо оператора равенства.
$3 ~ ($2 ~ /"[A-Z]"/ ? "^\"[[:digit:]]\"$" : "\"\"$") {
print "15th field invalid-OFFENCE FILE"
}
Однако это может быть более читабельным:
($2 ~ /"[A-Z]"/ && $3 ~ /^"[[:digit:]]"$/) ||
($2 !~ /"[A-Z]"/ && $3 ~ /^""$/) {
print "15th field invalid-OFFENCE FILE"
}
$ awk -F, '($2 ~ /"[A-Z]"/ ? "^\"[[:digit:]]\"$" : "\"\"$")' file
"ABC","","","a"
"ABC","A","2","a"