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

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

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

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

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

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

1 ответ1

1

Вы можете добиться этого, используя любой язык сценариев, который знает хеши / словари / ассоциативные массивы / как бы он ни вызывал функцию.

Очень очень очень простой подход будет выглядеть так:

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

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

РЕДАКТИРОВАТЬ: Перенаправление вывода в файл и переименование, которое будет отображаться как изменения в исходном файле с именем File1 здесь (создание резервной копии исходного файла всегда хорошая идея):

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

РЕДАКТИРОВАТЬ 2: Давайте будем немного менее буквальным:

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .