Как исключить в awk несколько не алфавитно-цифровых символов, используя vars - PullRequest
0 голосов
/ 08 октября 2018

Я определил серию символов, которые не хочу печатать.

В этом примере символ% правильно исключен:

awk 'BEGIN { FS=";";ch1 = "%";ch2 = "-"}
{
if(NR > 1)
{
    if($1 !~ ch1)
    {
            print $1
    }
} 
}
END {}' $1

, но когда я добавляю второйПеременная ch2 не применяется ни к одному из фильтров:

См. пример ниже:

awk 'BEGIN { FS=";";ch1 = "%";ch2 = "-"}
{
if(NR > 1)
{
    if($1 !~ ch1|| $1 !~ ch2 )
    {
            print $1
    }
} 
}
END {}' $1

, если в первом столбце указано либо ch1, либо ch2, я хочу, чтобы запись была исключена.

Как я могу это сделать?Спасибо

Ответы [ 4 ]

0 голосов
/ 08 октября 2018

если плохие символы нарушают ваш код awk, тогда переходите к шестнадцатеричным значениям.см. ниже

> hexdump -C <<< "%-"
00000000  25 2d 0a                                          |%-.|
00000003
> awk -F"|" -v ch1="\x25" -v ch2="\x2d" ' $1~ch1 { print "yes %" } $2~ch2 { print "yes -"} ' <<< "abc%|def-|ghi"
yes %
yes -
>

Пояснение

hexdump -C печатает шестнадцатеричное значение символа.

В этом примере% до 25 и -в 2d.

Теперь вы можете передать этот аргумент -v в код awk.

0 голосов
/ 08 октября 2018

Используйте и (&&) вместо или (||).

Теперь вы исключаете только строку, если она содержит обе последовательности.

0 голосов
/ 08 октября 2018

Если у вас есть причины использовать отдельную переменную для каждого символа:

awk '
BEGIN {
    FS=";"; ch1="%"; ch2="-"; badChars="["ch1 ch2"]"
}
(NR > 1) && ($1 !~ badChars) {
    print $1
} 
' "$1"
0 голосов
/ 08 октября 2018

Вы должны использовать && вместо ||, потому что вы хотите, чтобы $1 не содержал оба символа:

if($1 !~ ch1 && $1 !~ ch2 )

В качестве альтернативы, вы можете использовать выражение в скобках:

if ($1 !~ /[%-]/)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...