bash: Vertauschen übereinstimmender Nummern mit Benutzernamen, die in einer zweiten Datei enthalten sind

bash: Vertauschen übereinstimmender Nummern mit Benutzernamen, die in einer zweiten Datei enthalten sind

ich möchte die letzte Zahl jeder Zeile in „Datei 1“ durch den passenden Benutzernamen aus „Datei 2“ ersetzen, um das veröffentlichte Ergebnis zu erhalten.

Datei 1:

28.02.13 46.149002259
22.03.13 68.234001404
14.03.16 69,83500766
29.01.14 87.083008540
14.03.16 106,516006874
14.03.16 201.552002260
03/12/12 207.521011278
18.08.16 234,7780151002

Datei 2:

Benutzer5874
Benutzer2404
Benutzer81002
Benutzer4540
Benutzer1259
Benutzer6260
Benutzer7278
Benutzer366

Dies ist nur ein Teil der „Datei 2“. Die Datei enthält tatsächlich viel mehr Benutzer.

Ergebnis:

28/02/13 46.149002 Benutzer1
22/03/13 68.234001 Benutzer2
14/03/16 69.835007 Benutzer3
29/01/14 87.083008 Benutzer4
14/03/16 106.516006 Benutzer5
14/03/16 201.552002 Benutzer6 03/12/12 207.521011
Benutzer7
18/08/16 234.778015 Benutzer8

Antwort1

Ich gehe davon aus, dass Ihre Dateien dieses strikte Format haben, bei dem Leerzeichen nur Spalten trennen (Benutzernamen usw. enthalten keine Leerzeichen). Dann sollte dies funktionieren (zumindest unter Linux, mein Testgerät ist Kubuntu):

while read date value number ; do printf "%s %s %s\n" "$date" "$value" "$(grep " $number" file2 | head -n 1 | cut -f 1 -d " ")" ; done <file1

Einige Erklärungen:

  1. Der Befehl liest aus file1( … <file1).
  2. Solange es eine Zeile lesen kann ( while read …) …
  3. … es druckt es ( printf …), wobei das dritte Feld ersetzt wird durch …
  4. … der Effekt $( … )von …
    1. … Suche nach einer Zeile, die die angegebene Zahl enthält file2( grep …, beachten Sie das führende Leerzeichen: " $number") …
    2. … wobei nur die erste Übereinstimmung übernommen wird ( head …, nur für den Fall), …
    3. … und dann bleibt nur noch die erste Spalte übrig ( cut …).

verwandte Informationen