sed/awk/grep разбирает электронную почту в отфильтрованных текстовых файлах

С awk:

awk 'NR==FNR{a[$0];next}(!($0 in a)){print}' file2 file1

NR==FNR{a[$0];next}:
Для первого файла (файл2 )создайте массив aс ключом $0= целая строка и перейдите к следующей строке. NR — это глобальный номер записи awk, а FNR — номер текущей записи файла. Условие NR==FNR будет действительным только для первого чтения файла (файл2)

(!($0 in a){print}:
Когда первый файл2 завершится, прочитать файл1 и, если вся строка $0файла1 не принадлежит ключам массива a, вывести эту строку.

С grep:

grep -vxF -f file2 file1

-v:поймать не совпадающие строки
-x:соответствует всей строке
-F:сделать фиксированное совпадение вместо сопоставления с образцом
-f:использовать файл2 для загрузки паттернов

Для обновленных данных для построчного сравнения можно использовать awk, а не grep:

awk 'NR==FNR{a[FNR]=$0;next}$0!=a[FNR]{print}' file2 file1
1,2,1,1
1,2,4,2
1,2,1,2

Очевидно, что оба файла должны иметь одинаковое количество строк.

0
26.07.2019, 06:24
3 ответа
$ awk 'FNR==1 { provider = False } 
       $0 ~ /Provider/ { provider = True} 
       $0 ~ /@/ && provider == True {
         for (i=1; i<=NF; i++) {
           if ($i ~ /@/) print $i;
         }
       }' *
  • Для каждого файла установите от providerдо Falseв первой строке
  • Если строка содержит Provider, установите провайдера наTrue
  • Если строка содержит @и слово Providerбыло замечено ранее, переберите поля и напечатайте те, которые содержат@
1
28.01.2020, 02:39

Вы можете попробовать:

for fname in file*.txt
do
    if grep 'Provider' ${fname} &> /dev/null ; then
       grep -oP 'Email[[:space:]]*\K(.*@.*)' ${fname}
    fi
done
0
28.01.2020, 02:39
grep -l Provider file*.txt | xargs grep -o '[^@[:space:]]+@[^@[:space:]]+'

Существуют более точные регулярные выражения для адресов электронной почты, например. [0-9a-zA-Z._%+-]+@[0-9a-zA-Z.-]+\.[a-zA-Z]{2,}, если вам нужно уточнить.

0
28.01.2020, 02:39

Теги

Похожие вопросы