Условное заявление троичного оператора AWK не работает - PullRequest
1 голос
/ 13 марта 2019

У меня есть код, который проверяет содержимое переменной, созданной в результате анализа файла CSV. однако приведенный ниже код не работает.

 $3 ~ ($2 == "\"[ABCDEFGUHIJKLMNOPQRSTUVWXYZ]\"" ? "^\"[[:digit:]]\"$" : "\"\"$") {
  print "15th field invalid-OFFENCE FILE"
}

образец данных ниже

"ABC","A","","a" --- # This should fail because of no data in field 3
"ABC","","","a" --- # This should pass because of no data in field 2 thus it should use the else statement of empty
"ABC","A","2","a" --- # This should pass because of data in field 2 and 3

Однако, что на самом деле происходит, так это то, что второй образец, который должен пройти, терпит неудачу, и я не могу на всю жизнь понять, почему

Ответы [ 2 ]

2 голосов
/ 13 марта 2019

Глядя на ваш сценарий, кажется, что это немного неловко.Давайте переведем то, что вы сделали.

Примечание: Я предполагаю, что вы позвонили в awk с awk -F, -f file.awk inputfile

  1. $3 ~ expr: Эта строка пытается сопоставить поле 3 с расширенным регулярным выражением, представленным expr.
  2. ($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"
2 голосов
/ 13 марта 2019

Перейдите к этому, посмотрите, работает ли он:

$3 ~ ($2 ~ /"[A-Z]"/ ? "^\"[[:digit:]]\"$" : "\"\"$") {
  print "15th field invalid-OFFENCE FILE"
}

Точнее, вы можете изменить его на $2 ~ /^"[A-Z]"$/.

Но с этой строкой print вы можетене вижу различий.
Вы можете изменить его на:

print "Line: " FNR "\t15th field invalid-OFFENCE FILE"

Тогда вы увидите разницу.

Обновление :
Мынеправильно понял ваше значение,
если fail означает печать, а pass игнорировать, то это то, что вы хотели:

$3 ~ ($2 ~ /"[A-Z]"/ ? "\"\"$" : "^\"[[:digit:]]\"$") {
  print "Line: " FNR "\t15th field invalid-OFFENCE FILE"
}

Изменить положение двухветви сделают.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...