Frage Bash: Austauschen von übereinstimmenden Zahlen mit Benutzernamen in einer zweiten Datei [geschlossen]


Ich möchte die letzte Nummer jeder Zeile in "Datei 1" mit dem passenden Benutzernamen aus "Datei 2" ersetzen, um das gepostete Ergebnis zu erhalten.

Datei 1:

28/02/13 46.149002 259
  22/03/13 68.234001 404
  14/03/16 69.835007 66
  29/01/14 87.083008 540
  14/03/16 106.516006 874
  14/03/16 201.552002 260
  03/12/12 207.521011 278
  18/08/16 234.778015 1002 

Datei 2:

Benutzer5 874
  Benutzer2 404
  Benutzer8 1002
  Benutzer4 540
  Benutzer1 259
  Benutzer6 260
  Benutzer7 278
  Benutzer3 66 

Dies ist nur ein Teil von "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 user4
  14.03.16 106.516006 Benutzer5
  14/03/16 201.552002 user6
  03/12/12 207.521011 user7
  18/08/16 234.778015 benutzer8


0
2017-08-26 19:01


Ursprung


-1. Sie können hier eine vollständige Lösung erhalten, aber im Allgemeinen sind wir kein Skript-Dienst. Die Frage zeigt nicht Ihre Forschungsanstrengungen überhaupt. Was hast du bisher versucht? ZB: "Ich denke, es kann mit (Name des Tools) und (Name ein anderes Werkzeug) getan werden. Ich habe diese Lösung gefunden (Link geben), aber ich habe Probleme, es an meine Bedürfnisse zu ändern. Mein Skript ist so weit ( Code einfügen). " Du musst nicht so gut sein, aber zeig es uns Sie Ich habe etwas mehr getan, als diese Frage hier zu posten und fest zu sitzen. Hinterlasse mir einen Kommentar, wenn du dich verbesserst (bearbeiten) Ihre Frage und ich werde meinen Downvote widerrufen. - Kamil Maciorowski
Ich stimme dieser Frage als off-topic zu, weil sie zu spezifisch ist, um für die breitere Community nützlich zu sein. - Patches


Antworten:


Ich nehme an, dass Ihre Dateien dieses strikte Format haben, wo Leerzeichen nur Spalten trennen (es gibt keinen Platz innerhalb eines Benutzernamens usw.). Dann sollte das funktionieren (zumindest unter Linux, mein Testbed 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ärung:

  1. Der Befehl liest von file1 (… <file1).
  2. Solange es eine Zeile lesen kann (while read …) ...
  3. ... druckt es (printf …) mit dem dritten Feld ersetzt durch ...
  4. … der Effekt ($( … )) von …
    1. ... nach einer Zeile suchen, die die angegebene Zahl enthält file2 (grep …, notiere den führenden Platz: " $number") ...
    2. ... wo nur das erste Spiel stattfindet (head …, nur für den Fall), ...
    3. ... und dann ist nur noch die erste Spalte übrig (cut …).

2
2017-08-26 20:28