Ich habe drei Dateien mit einer sortierten Folge von Zahlen, eine pro Zeile:
Datei1
1
2
3
Datei2
1
3
4
file3
1
5
Ich möchte diese drei Dateien wie folgt nebeneinander "ausrichten":
file1 file2 file3
1 1 1
2
3 3
4
5
Ich habe es versucht, sdiff
aber es funktioniert nur mit 2 Dateien
text-processing
awk
diff
cheseaux
quelle
quelle
diff3
?diff3
hat dieses Ausgabeformat nicht.diff3
und wie @Kusalananda richtig angegeben hat, wird diese Ausgabe nicht erzeugt. Außerdem suche ich nach einer generischen Lösung (für n Dateien, n> 2)5
ist in der fünften Zeile das Ergebnis statt der dritten?Antworten:
Sie können jede Datei verarbeiten und eine Zeile mit einem Zeichen drucken, z. B.
X
für jede fehlende Zahl in der Sequenz 1 - max (wobei max die letzte Zahl in dieser Datei ist).paste
Die Ergebnisse ersetzen dieses Zeichen dann durch Leerzeichen:Wenn in allen Dateien ein bestimmter Wert fehlt, werden in Ihrer Ausgabe leere Zeilen angezeigt (tatsächlich sind sie nicht leer, sie enthalten nur Leerzeichen).
Um sie zu entfernen ersetzen
tr X ' '
mitsed '/[[:digit:]]/!d;s/X/ /g'
Auch, wenn Sie einen Header benötigen , können sie so etwas wie dieses erste laufen:quelle
;1
Teil am Ende bedeutete. Ich benutze{print $0}
stattdessen ein bisschen weniger kryptisch IMHO. Wie auch immer, nochmalsEine allgemeine Lösung mit awk: erfordert GNU awk
Hat einen anderen und einfacheren Ansatz gewählt, basierend auf Dons Kommentar:
quelle
Eine Lösung mit
bash
,join
,paste
, und schlechten Geschmack:Mit Ausnahme des letzten
sort -n
funktioniert dies alles mit Textelementen und nicht mit Zahlen, solange die Elemente keine Tabulatoren enthalten (sondernTAB
in ein anderes Trennzeichen geändert werden können). Es könnte auch mit nur 3 temporären Dateien und einigem Mischen gemacht werden (aber das würde nur den schlechten Geschmack erhöhen).quelle