Ich habe eine Datei mit Zeilen, genau wie folgt:
A
B
C
Ich möchte eine doppelte Datei in Bash erstellen, die jede Zeile enthält, die mit der Kopie der nächsten Zeile zusammengeführt wird, wie:
A;B
B;C
C;
text-processing
awk
sed
banuj
quelle
quelle
;
Zeichen?Antworten:
Verwenden von
awk
:was mit Ihrer Eingabe gibt
quelle
Schneller Weg (beinhaltet das zweimalige Lesen der Datei):
quelle
paste
kurz darauf gelesen,tail
sodass er sich im Cache befindet. Die Chancen stehen gut, dass es effizienter ist alssed
/awk
basierte Lösungen. Ein Nachteil ist, dass es nicht an Rohren funktionieren kann.paste -d';' file <(sed 1d file)
Was dieser
sed
Ausdruck tut:x
: Speichern Sie die eingehende Zeile im Haltebereich und rufen Sie die vorherige abG
: Hänge die neue Zeile (aus dem Haltebereich) an die alte ans_\n_;_
: Zeilenumbruch durch a ersetzen;
.1d
: Wenn dies die erste Zeile ist, löschen Sie sie (drucken Sie sie nicht aus) und fahren Sie mit der nächsten fort${...;}
: wenn dies die letzte Zeile ist ...p
: Drucken Sie zuerst das verbundene Paarx
: die letzte Zeile abrufens_$_;_
: final anhängen;
quelle
Etwas einfachere
sed
Lösung ohne Speicherplatz:$!N
um der nächsten Zeile beizutreten (falls vorhanden;$!
wird bei GNU nicht benötigt,sed
wenn nicht im POSIX-Modus)y/\n/;/
Ersetzen Sie die Newline durch;
p
Drucken Sie die resultierende Liniey/;/\n/
zurück zu newline wechseln, also mitD
Sie können die erste Zeile entfernen und mit der nächsten fortfahrenquelle
C
nichtC;
im Beispiel des OP.$!y/;/\n/
wenn das Trailing;
erforderlich ist.Gleiche Grundidee wie die von Torin gegebene awk-Lösung :
Oder wenn Sie sich für die ganze Kürze interessieren:
quelle
Eine Vim-Lösung
Man kann diesen Befehl ausgeben (Dank an Conspicuous Compiler, der dies vorgeschlagen hat):
Alternativ und wahrscheinlich üblicher starten Sie Vim, öffnen Sie die Datei und geben Sie den Befehl ex ein:
Erläuterung:
Ersetzen Sie das Muster:
\n
\(.+\)
, die die gesamte nächste Zeile zusammensetzt. Der folgende Quantifizierer*
zeigt nur an, dass es null oder mehr Übereinstimmungen geben kannmit den folgenden:
\1
\n
\1
.Vor:
Nach:
quelle
vim '+*ThisReallylongCommand*'
quelle