от символа к символу substituion с sed

Метод № 1: grep и awk

Можно использовать этот отрывок, чтобы сделать это:

$ 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.

Метод № 2: Просто awk

Другой подход, который использовался на сайте в прошлом, должен использовать 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
2
30.09.2014, 11:19
2 ответа

Попробуйте:

$ echo ABCDBAD | sed 'y/ABCD/DEFG/'
DEFGEDG

y/string1/string2/ заставляет sed заменить все вхождения символов в string1 на соответствующие символы в string2.

5
27.01.2020, 21:50

Вместо sed используйте tr:

tr 'A-Z' 'DGHJK...' < input
5
27.01.2020, 21:50

Теги

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