Ich habe also 2 sehr große Textdateien, die aus folgenden Zeilen bestehen:
Zuerst:
Robert:Dillain:Other:Other:Other
Julian:Brude:Other:Other:Other
Megan:Flikk:Other:Other:Other
Samantha:Minot:Other:Other:Other
Jesus:Kimmel:Other:Other:Other
Zweite:
Sb:Minot:amsen
Jbb:Kimmel:verlin
R:Dillain:bodent
Mb:Flikk:kentin
Jb:Brude:kemin
Ich möchte sie beide durch die zweite Spalte (Dillain, Brude usw.) abgleichen und sie in Zeilen wie folgt einfügen:
AUSGABE:
Robert:Dillain:Other:Other:Other:R:Dillain:bodent
Jesus:Kimmel:Other:Other:Other:Jbb:Kimmel:verlin
Samantha:Minot:Other:Other:Other:Sb:Minot:amsen
etc...
etc...
Ich habe darüber nachgedacht, sed
dies zu verwenden, aber alles, was auf Unix basiert, wäre großartig. Ich hatte kein Glück, einen Weg zu finden, dies selbst zu tun.
Antworten:
Das klingt nach einer Aufgabe für
join
:Ausgabe:
Nervenzusammenbruch:
-t
Setzen Sie das Feldtrennzeichen auf:
-o
Druckformat einstellen-j
Join auf Spaltennummer2
<(sort -k2,2 -t: file)
Datei nach-k
zweiter Spalte sortieren-t
Feldbegrenzer auf setzen:
quelle
-k2,2
. Ja, esjoin
ist ein lustiges nützliches Tool, das die meisten vergessen, auf dem System zu sein - (ich weiß, dass ich es tue), da ich nicht jeden Tag zwei Dateien zusammenfügen muss. Ich neige dazu,join
so häufig zu verwenden, wie es Sonnenfinsternisse gibt. lolDies ist eine einfache Aufgabe für
awk
:Zuerst setzen wir
:
als Feldtrennzeichen sowohl für Eingabe (mit-F
) als auch für Ausgabe (mitOFS
). Wenn dann die erste Datei verarbeitet wird (file2
), weisen wir dem mit dem zweiten Feld indizierten Tabellenelement eine ganze Zeile zu. Wenn die nächste nächste Datei (file1
) verarbeitet wird, drucken wir ihre Zeilen und fügen die Zeile aus der vorherigen Datei hinzu, in der sie gespeichert ista[$2]
.quelle
Mit können
sed
Sie wahrscheinlich tun:... was bedeuten würde, dass ein
sed
Prozess die zweite Datei liest und einsed
Skript zum Bearbeiten der ersten in densed
Standard eines zweiten schreibt . Soweit ich das beurteilen kann, sollten Sie kein Problem damit haben, den Inhalt wörtlich direkt in einen solchen regulären Ausdruck einzufügen. Wenn die Möglichkeit der Eingabe von Metazeichen besteht, gibt es auf dieser Website zahlreiche Antworten, in denen die Möglichkeiten zur Flucht vor diesen Zeichen erläutert werden. Wenn dies jedoch erforderlich sein könnte, würde Folgendes ausreichen:Dennoch ist wahrscheinlich der Namensgeber
join
die bessere Lösung - dies soll nur zeigen, wie es geht,sed
weil Sie es erwähnt haben.Wie auch immer, das Skript, für das das zweite
sed
gilt,file1
sieht wie folgt aus (mit einer Zeile ähnlich der unten für jede Zeile in Datei2) :... was bedeutet, dass, wenn es auf eine Linie trifft, die mit Dillain für das zweite durch Doppelpunkte getrennte Feld übereinstimmt, die Zeichenfolge : R: Dillain: bodent an den Schwanz angehängt werden sollte . Da es wahrscheinlich keinen Sinn macht, weiterhin zu versuchen, eine Zeile zuzuordnen,
file1
wenn eine Zeile vonfile2
bereits angehängt wurde,t
verzweigt der Befehl trailing est jede erfolgreiche Ersetzung einfach weg, sobald sie abgeschlossen ist.quelle
awk
Dafür wurde mir das Tag-Abzeichen verliehen: Ich weiß nicht einmal, wie ich es verwenden sollawk
.Durch Python3
Kopieren Sie das obige Skript und fügen Sie es in eine Datei mit dem Namen ein
script.py
. Führen Sie dann das Skript aus, indem Sie den folgenden Befehl auf dem Terminal ausführen.quelle