Можно использовать этот отрывок, чтобы сделать это:
$ grep -f <(awk -F '|' '{print $5}' file1) file2
Connect|20130320000025|UTC|PPP|test3@test3.co.uk|test1@test1.co.uk|0BCBE578|
Бит, который использует awk
анализирует первый файл, file1
вытаскивая все 5-е столбцы. Эти значения затем используются в качестве списка к grep
, который распечатает любые строки в 2-м файле, которые содержат соответствие.
Этот метод будет соответствовать любому возникновению 5-го столбца от file1
в file2
.
Другой подход, который использовался на сайте в прошлом, должен использовать awk
средство FNR. Это то, где awk
выполнит итерации более чем 2 файлов, проходя второй файл линию за линией, для каждой строки в первом.
Подход как это сделал бы это. Поместите следующее в файл, cmds.awk
:
FNR == NR {
f1[$5] = $5
next
}
{ if ($5 == f1[$5]) print $0; }
Можно затем выполнить это следующим образом:
$ awk -F '|' -f cmds.awk file1 file2
Примечание: Вы, возможно, использовали это awk
шаблон вместо этого:
FNR == NR {
f1[$5] = $5
next
}
{ if ($5 in f1) print $0; }
$ awk -F '|' -f s.awk file1 file2
Connect|20130320000025|UTC|PPP|test3@test3.co.uk|test1@test1.co.uk|0BCBE578|
Этот подход может только обработать единственный экземпляр каждого адреса электронной почты от file1
. Таким образом, если будет 2 строки, что у обоих есть то же значение для 5-го столбца, это не сможет различать их. Это кажется приемлемым, учитывая Ваши требования в OP все же.
Можно также сделать это использование join
и sort
.
$ join -t '|' -j 5 <(sort -k5,5 file2) <(sort -k5,5 file1) | sed 's/||.*//'
Это будет использовать разделитель |
и присоединитесь к отсортированным файлам на 5-м столбце. Этот подход печатает соответствия от обоих file1
и file2
, таким образом, мы используем sed
прервать 2-е соответствие от конца.
$ join -t '|' -j 5 <(sort -k5,5 file2) <(sort -k5,5 file1) | sed 's/||.*//'
test3@test3.co.uk|Connect|20130320000025|UTC|PPP|test1@test1.co.uk|0BCBE578