Вы запрашиваете 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);
?>
Похоже, что вам нужно сделать следующее:
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
Команда
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
Если цель состоит в том, чтобы изучить 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:"{......