Awk столбец с массивом шаблонов - PullRequest
1 голос
/ 04 февраля 2020

Можно ли это сделать, но использовать фактический массив строк, где написано "массив"

array=(cat
dog
mouse
fish
...)

awk -F "," '{ if ( $5!="array" ) { print $0; } }' file

Я хотел бы использовать пробелы в некоторых строках в моем массиве. Я также хотел бы иметь возможность совпадать с частичными совпадениями, поэтому «снег» в моем массиве будет соответствовать «снеговику». Он должен быть чувствительным к регистру.

Пример csv

s,dog,34
3,cat,4
1,african elephant,gd
A,African Elephant,33
H,snowman,8
8,indian elephant,3k
7,Fish,94
...

Пример массива

snow
dog
african elephant

Ожидаемый вывод

s,dog,34
H,snowman,8
1,african elephant,gd

Сайрус опубликовал это, что хорошо работает, но не допускает пробелов в строках массива и не будет совпадать с частичными совпадениями.

echo "${array[@]}" | awk 'FNR==NR{len=split($0,a," "); next} {for(i=1;i<=len;i++) {if(a[i]==$2){next}} print}' FS=',' - file

Ответы [ 2 ]

2 голосов
/ 05 февраля 2020

Краткий подход с использованием одного регулярного выражения для всего содержимого массива:

$ array=('snow' 'dog' 'african elephant')
$ printf '%s\n' "${array[@]}" | awk -F, 'NR==FNR{r=r s $0; s="|"; next} $2~r' - example.csv
s,dog,34
1,african elephant,gd
H,snowman,8

Или, если вы предпочитаете сравнение строк:

$ cat tst.sh
#!/bin/env bash

array=('snow' 'dog' 'african elephant')

printf '%s\n' "${array[@]}" |
awk -F',' '
    NR==FNR {
        array[$0]
        next
    }
    {
        for (val in array) {
            if ( index($2,val) ) {      # or $2 ~ val for a regexp match
                print
                next
            }
        }
    }
' - example.csv

$ ./tst.sh
s,dog,34
1,african elephant,gd
H,snowman,8
1 голос
/ 04 февраля 2020

Это не печатает ни одной строки из файла CSV, который содержит элемент из массива в столбце 5:

echo "${array[@]}" | awk 'FNR==NR{len=split($0,a," "); next} {for(i=1;i<=len;i++) {if(a[i]==$5){next}} print}' FS=',' - file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...