Как в awk добавить строку перед поиском по шаблону

Вы запрашиваете awk, но хотите создать массив PHP, поэтому я решил дать вам PHP-способ сделать это -и да, вы можете запустить PHP из командной строки...

Вставьте свои 2 строки в файл

а б в г д ђ е ж з и ј к л љ м н њ о п р с т ћ у ф х ц ч џ ш
a b c č ć d dž đ e f g h i j k l lj m n nj o p r s š t u v z ž

А затем прочитайте этот файл с помощью file(), который переводит каждую строку в элемент массива.

Затем выполните цикл по этому массиву, разбивая каждую строку на отдельный массив на основе разделения пробелами, используяexplode()

Затем прокрутите две строки и перестройте ассоциативный массив.

Я замечаю, что последний символ в первой строке, кажется, приводит к появлению нового символа строки, но это может быть проблемой кодировки... я недостаточно знаком с работой с наборами иностранных символов.

<?php

$letters=file("letters");

for($i=0;$i<count($letters);$i++){
    $line[$i]=explode(" ",$letters[$i]);
}

for($i=0;$i<count($line[1]);$i++){
        $newArray[$line[0][$i]]=$line[1][$i];
}

print_r($newArray);

?>
-2
25.07.2020, 12:46
3 ответа

Похоже, что вам нужно сделать следующее:

awk '/To:|From:|Cc:/ {$2=substr($2,1,length($2)-1); print "email = ", $2 }' file

Этот бит:

{$2=substr($2,1,length($2)-1)

Берет второй элемент в строке, что-то вроде someemail@email.com>, и удаляет последний символ, >.

Затем вы просто печатаете нужную строку "email = "вместе с отредактированным вторым элементом,$2:

print "email = ", $2

Результат выглядит следующим образом:

email =  someemail@email.com
email =  Otheremail@email.com
email =  othermail@mail.com

Стоит ознакомиться с тем, как работает печать:https://www.gnu.org/software/gawk/manual/html_node/Print-Examples.html

1
18.03.2021, 23:17

Команда

awk -F ":" '/To|Cc|From/{gsub(">","",$2);print "email ="$2}'имя файла

выход

email = someemail@email.com
email = Otheremail@email.com
email = othermail@mail.com

Питон

#!/usr/bin/python
import re
k=re.compile(r'To|Cc|From')
q=open('filename','r')
for i in q:
    if re.search(k,i):
        w=i.split(":")[1].replace(">","")
        print "email = {0}".format(w).strip()

выход

email =  someemail@email.com
email =  Otheremail@email.com
email =  othermail@mail.com
0
18.03.2021, 23:17

Если цель состоит в том, чтобы изучить awk, тогда вы можете попробовать некоторые другие функции. Это немного зависит от форматирования вашего файла, но тогда, как и другие ответы, поэтому

awk -F'>|<| ' -v OFS=" = " '/To:|From:|Cc:/{print "E-mail", $(NF-1)}' file

E-mail = someemail@email.com
E-mail = Otheremail@email.com
E-mail = othermail@mail.com

Сначала вы можете настроить разделитель полей ввода -Fкак расширенное регулярное выражение, ERE, чтобы он разбивал строку ввода $0на <, >или

.
-F'>|<| ' 

При этом удаляется лишний символ в конце адреса электронной почты, но $1остается пустым (, поскольку начальные <), $2содержат ваше поле фильтрации,$3адрес электронной почты, и в конце (есть пустой $4из-за завершающего>)

Затем, будучи ленивым, вы можете установить разделитель полей вывода на =, поэтому всякий раз, когда вы печатаете ряд полей, поведение по умолчанию будет вставлять =, а не только между полями

-v OFS=" = " 

Ваша фильтрация такая же, как и для $0, но когда вы печатаете, потому что вы разделяете входную строку $0на 4 (и количество полей, специальную переменную awk, NF= 4 )вы хотите напечатать $3, что также $(NF-1)в данном случае

'/To:|From:|Cc:/{print "E-mail", $(NF-1)}' file

И поскольку вы явно вытащили поле фильтра, вы можете защититься от случайного совпадения в другом месте $0, выполнив поиск явного совпадения в $2, если хотите.

'$2=="To:"||$2=="From:"||$2=="Cc:"{......
0
18.03.2021, 23:17

Теги

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