AWK решение паттерна, отрицающего CSV - PullRequest
0 голосов
/ 01 марта 2019

У меня есть файл со списком шаблонов, который необходимо удалить из CSV с полным / частичным совпадением со столбцом $ 5 (считая от $ 1).

Попробовал grep -vwF -f <pattern file> <csv file>

Почему-то не работает.Мне нужно решение awk.

Входной файл:

type|||URL|||Date|||Domain|||Referral URLs|||more columns
1|||https://www.google.com|||1524024000|||google.com|||https://www.google.com||| and more 
2|||www.bwin.hu|||1524024324|||bwin.hu|||http://www.bwin.hu/q=sdlfj||| and more

Файл шаблона может содержать: bwin.hu ИЛИ www.bwin.hu ИЛИ http://www.bwin.hu

Требуется вывод:

1|||https://www.google.com|||1524024000|||google.com|||https://www.google.com||| and more 

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

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Предполагая, что вы хотите частичное совпадение строк:

awk '
BEGIN { FS="[|]{3}" }
NR==FNR { a[$0]; next }
{
  for (str in a) {
      if ( index($5,str) ) {
          next
      }
  }
}
1'  pattern_file  Input_file
0 голосов
/ 01 марта 2019

Не так ясно, хотя, увидев ваши образцы и попытку, я мог бы написать это.Не могли бы вы попробовать следующее (также протестировано только с предоставленными вами образцами).

awk '
BEGIN{
  FS="\\|\\|\\|"
}
FNR==NR{
  a[$0]=$0
  next
}
{
  val=$2
}
{
  flag=""
  for(i in a){
      if(a[i] ~ val){
         flag=1
      }
  }
}
!flag
'  pattern_file  Input_file

Несколько замечаний, которые следует отметить:

1 - Для большей безопасности я удалил пробел в последней строке каждой строкив Pattern_file и во 2-м поле Input_file (если их там нет, вы можете удалить sub(/[[:space:]]+$/,"") AND sub(/[[:space:]]+$/,"",$2) из приведенного выше кода. Я также удаляю символы, такие как ()[], чтобы избежать любых ошибок в сопоставлении (при проверке только условий, фактическихсодержимое будет напечатано в нем, хотя).

2- Также я сохранил весь файл (шаблон один) в массив, а затем для каждой строки Input_file я проверяю, соответствует ли он какой-либо контент в массиве или нет, установка флага при совпадении.

3 - Если флаг НЕ установлен, кажется, что совпадение не найдено, поэтому печать содержимого из Input_file затем.

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