Verwenden Sie 'diff', um Benutzernamen von Datei1 mit Datei2 zu vergleichen, die E-Mails enthält

275
Boring Loop

Ich versuche, aktive Konten über tote Konten zu identifizieren und habe mich gefragt, ob sie diffzusammen mit grepoder sedoder regexverwendet werden können, anstatt ein langes Programm zu schreiben.

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

Jede Datei enthält etwa 1000 Mal, und ich muss dies häufig einmal pro Woche tun.

Aufgabe -
Prüfen Sie, ob die Benutzernamen von File1 in File2 vorhanden sind. In den obigen Beispieldaten sind sie vorhanden.
-Wenn sie existieren, kommentieren Sie sie in Datei1 aus.

In der Vergangenheit habe ich diff zum Vergleichen von Dateien und Regex dazu verwendet, Zeilen zu ignorieren. Leider kann ich mein Gehirn nicht umwickeln, um einen Teil der Zeichenfolge aus den E-Mails zu ignorieren oder zu berücksichtigen. (Da @ und irgendetwas danach nicht vergleichbar ist)

Jede Hilfe wäre dankbar. :)

0

1 Antwort auf die Frage

1
Gombai Sándor

Sie können dies mit jeder Skriptsprache erreichen, die Hashes / Wörterbücher / assoziative Arrays / was auch immer die Funktion nennt, kennt.

Ein sehr sehr einfacher Ansatz wäre so:

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

Wahrscheinlich können Sie sehen, dass diese nichts in den Eingabedateien ändert, sondern nur stdout schreibt.

BEARBEITEN: Umleiten der Ausgabe in eine Datei und Umbenennen, die hier als Änderungen in der Originaldatei mit dem Namen Datei1 erscheinen würden (eine Sicherung der Originaldatei ist immer eine gute Idee):

$> 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: Lassen Sie uns etwas weniger wörtlich sein:

$> 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` kann die Ausgabe jedoch nicht in die Eingabedatei schreiben. Welches ist eine Notwendigkeit. Boring Loop vor 8 Jahren 0
Nothings hindert Sie daran, die Ausgabe in eine neue Datei umzuleiten und die neue Datei in File1 umzubenennen. Das ist eigentlich das, was ein Programm im Inneren tun würde, wenn Sie an Textdateien arbeiten, für die kein Flag für die Kennzeichnung vorgesehen ist. Gombai Sándor vor 8 Jahren 0
Können Sie eine Lösung mit Ihrer Antwort angeben? Da mir "awk" und seine Eigenschaften nicht vertraut sind. Boring Loop vor 8 Jahren 0
Okay, habe es getan. Für die Umleitung und das Umbenennen ist eigentlich keine andere Funktion erforderlich, als das Basisbetriebssystem. Gombai Sándor vor 8 Jahren 0
Kann ich die Variable File1 & File2 den tatsächlichen Dateinamen zuweisen oder muss ich die Dateinamen in den Befehl eingeben. Boring Loop vor 8 Jahren 0
Außerdem habe ich Ihren Befehl verwendet und leere Dateien erhalten. Ihr Befehl scheint File1 und File1.old leer zu halten, keinen Inhalt. Boring Loop vor 8 Jahren 0
Ich vermute, Sie haben die Mail- und Personendatei in der falschen Reihenfolge in der Parameterliste angegeben. Hier ist es wichtig Gombai Sándor vor 8 Jahren 0
Ich würde den Befehl also als `export PERSONFILE = usernames.txt schreiben. EMAILFILE = emails.txt; awk ... `und es sollte funktionieren? Recht? Boring Loop vor 8 Jahren 0
Ja, so geht's. Gombai Sándor vor 8 Jahren 0
Ich brauchte eine kleine Hilfe. Ist es möglich, die Kommentaroption auf die E-Mail-Datei und NICHT auf die Benutzername-Datei umzuschalten. Bitte entfernen Sie auch nicht die E-Mail-Adresse, kommentieren Sie sie einfach aus. Boring Loop vor 8 Jahren 0