С 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
Очевидно, что оба файла должны иметь одинаковое количество строк.
$ 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
было замечено ранее, переберите поля и напечатайте те, которые содержат@
Вы можете попробовать:
for fname in file*.txt
do
if grep 'Provider' ${fname} &> /dev/null ; then
grep -oP 'Email[[:space:]]*\K(.*@.*)' ${fname}
fi
done
grep -l Provider file*.txt | xargs grep -o '[^@[:space:]]+@[^@[:space:]]+'
Существуют более точные регулярные выражения для адресов электронной почты, например. [0-9a-zA-Z._%+-]+@[0-9a-zA-Z.-]+\.[a-zA-Z]{2,}
, если вам нужно уточнить.