Используя diff, сравниваем имена пользователей из файла file1 с файлом file2, содержащим электронные письма

221
Boring Loop

Я пытаюсь определить активные счета замертво счетов и был интересно, если diffвместе с grepили sedили regexможет быть использован вместо того, чтобы писать длинную программу.

File1 (usernames) File2 (emails) janedoe johndoe@email.com johndoe janedoe@email.com 

Каждый файл содержит около 1000 раз, и мне нужно делать это часто, раз в неделю или около того.

Задача
-Проверьте, существуют ли имена пользователей из файла File1 в файле File2. В приведенном выше примере данных они существуют.
-Если они существуют, закомментируйте их в File1.

В прошлом я использовал diff для сравнения файлов и использовал regex для игнорирования строк. Но, к сожалению, я не могу обернуть свои мозги, чтобы игнорировать или рассматривать только часть строки из электронных писем. (С @ и ничего после этого не сравнимо)

Любая помощь будет оценена. :)

0

1 ответ на вопрос

1
Gombai Sándor

You can achieve that using any script language that knows hashes/dictionaries/associative arrays/whatever it calls the feature.

A very very very simple approach would be like this:

$> cat File1 johndoe janedoe nosuchkid $> cat File2 johndoe@email.com janedoe@email.com $> awk -F'@' 'FILENAME=="File2" { emails[$1]=$0; next}; { print ($1 in emails) ? $1 : "# "$1}' File2 File1 johndoe janedoe # nosuchkid 

Probably, you can see that this one does not modify anything in the input files just writes stdout.

EDIT: Redirecting the output into a file and renaming that would appear as changes in the original file called File1 here (making a backup of the original file is always a good idea):

$> awk -F'@' 'FILENAME=="File2" { emails[$1]=$0; next}; { print ($1 in emails) ? $1 : "# "$1}' File2 File1 > File1.tmp ; cp File1 File1.old ; mv File1.tmp File1 $> cat File1 johndoe janedoe # nosuchkid 

EDIT2: Let's be a little less literal:

$> export PERSONFILE=File1 EMAILFILE=File2; awk -F'@' 'FILENAME==ENVIRON["EMAILFILE"] { emails[$1]=$0; next}; { print ($1 in emails) ? $1 : "# "$1}' "$EMAILFILE" "$PERSONFILE" > "$PERSONFILE.tmp" ; cp "$PERSONFILE" "$PERSONFILE.old" ; mv "$PERSONFILE.tmp" "$PERSONFILE" 
Но `awk` не может записать вывод во входной файл. Что является необходимостью. Boring Loop 8 лет назад 0
Nothings мешает вам перенаправить вывод в новый файл и переименовать новый файл в File1. На самом деле, это то, что любая программа будет делать внутри при работе с текстовыми файлами, где нет выделенного байта в файле для целей флага. Gombai Sándor 8 лет назад 0
Можете ли вы предоставить решение, используя свой ответ. Так как я не знаком с `awk` и его свойствами. Boring Loop 8 лет назад 0
Хорошо, так и сделал. На самом деле для перенаправления и переименования не требуется никаких других функций, кроме того, что обеспечивает базовая ОС. Gombai Sándor 8 лет назад 0
Могу ли я присвоить переменным File1 & File2 фактические имена файлов или мне нужно ввести имена файлов в команде. Boring Loop 8 лет назад 0
Также я использовал вашу команду и получил пустые файлы. Кажется, ваша команда хранит пустые файлы File1 и File1.old, без содержимого. Boring Loop 8 лет назад 0
Полагаю, вы указали неверный порядок в списке параметров почтовый и личный файл. Здесь важно Gombai Sándor 8 лет назад 0
Итак, я бы написал команду как `export PERSONFILE = usernames.txt EMAILFILE = emails.txt; awk ... `и это должно работать? Правильно? Boring Loop 8 лет назад 0
Да, это путь. Gombai Sándor 8 лет назад 0
Мне нужна была небольшая помощь. Можно ли переключить опцию комментирования на файл электронной почты, а НЕ на файл имени пользователя. Также, пожалуйста, не удаляйте адрес электронной почты, просто закомментируйте его. Boring Loop 8 лет назад 0

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