Использование статического выражения if в awk для проверки, соответствует ли одна переменная формату, если так, следуйте этому пути - PullRequest
0 голосов
/ 06 марта 2019

Я хочу иметь возможность проверить данные, хранящиеся в одной переменной, если данные внутри "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 ]

1 голос
/ 06 марта 2019

Я действительно хотел бы, чтобы вы опубликовали некоторые образцы данных, а не 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

Это то, что вы хотели?

1 голос
/ 06 марта 2019

Обновление :
Условия могут комбинироваться:
($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 для краткости, поскольку length возвращаетцелое число.

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