Сопоставление столбца с несколькими возможными значениями - PullRequest
0 голосов
/ 29 октября 2018

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

hadoop fs -text file:///a/b/filename.snappy  awk -F'|'  '$11 == 655' > filter_20180705.txt

Я хочу передать список значений в разделе сравнения, вместо того, чтобы передавать $11 == 655, я хотел бы передать список типа $11 IN (список). Любые мысли по этому поводу будут полезны

Sample-данные:

karthick,bangalore,software,it,bfsi,spark,hadoop,bigdata,etl,pentaho,655,dev
kumar,bangalore,software,it,bfsi,spark,hadoop,bigdata,etl,pentaho,611,dev
Raj,bangalore,software,it,bfsi,spark,hadoop,bigdata,etl,pentaho,800,dev
John,bangalore,software,it,bfsi,spark,hadoop,bigdata,etl,pentaho,823,dev

На данный момент я получаю результат как

karthick,bangalore,software,it,bfsi,spark,hadoop,bigdata,etl,pentaho,655,dev

Мне нужно будет передать список в фильтре сравнения. Например, я хочу добавить 611 и 823. Таким образом, ожидаемый результат будет

karthick,bangalore,software,it,bfsi,spark,hadoop,bigdata,etl,pentaho,655,dev
kumar,bangalore,software,it,bfsi,spark,hadoop,bigdata,etl,pentaho,611,dev
John,bangalore,software,it,bfsi,spark,hadoop,bigdata,etl,pentaho,823,dev

Ответы [ 2 ]

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

Для эффективности я бы сделал следующее:

awk -F, -v list='655,611,823' '
    BEGIN {
        split(list,tmp)
        for (i in tmp) {
            expected[tmp[i]]
        }
    }
    $11 in expected
' file

Таким образом, вы просто просматриваете хеш для каждой строки ввода, а не сравниваете регулярные выражения.

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

Определите переменную в контексте Awk (используя -v), чтобы включить альтернативы для вашего соответствия регулярному выражению (разделенные |), и выполните свое соответствие, как показано ниже. ~ - это ваш оператор соответствия регулярному выражению в Awk, который позволяет сопоставить $11 с определенной строкой (см. Как использовать регулярные выражения ).

awk -F, -v list="655|611|823" '$11 ~ list' file

При указанном выше подходе ваша команда преобразуется в $11 для любой записи, определенной в переменной list. Чтобы отменить ваше совпадение с регулярным выражением (то есть противоположное тому, что я хочу сопоставить), используйте оператор отрицания ! как

awk -F, -v list="655|611|823" '$11 !~ list' file

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

awk -F, -v list="655|611|823" 'BEGIN{list="^(" list ")$"} $11 ~ list' file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...