Ich muss eine Liste (Ladungen) von IP-Adressen in diesem Format nehmen:
134.27.128.0
111.245.48.0
109.21.244.0
und verwandle sie in dieses Format mit einem Pipe dazwischen (IPs gemacht)
134.27.128.0 | 111.245.48.0 | 109.21.244.0 | 103.22.200.0/22
Ich denke, es ist ein Befehl zum Suchen und Ersetzen, sed
aber ich kann es nicht zum Laufen bringen.
shell
text-processing
uselesslinuxman
quelle
quelle
tr
nur Zeilenumbrüche in|
Pfeifen umwandeln ? Wie<ipfile tr \\n \| >outfile
?|
erforderlich?<
. Also<mydoc tr \\n \| >mydoc2
. Aber das bringt dir nicht die Räume. Für diejenigen, die wahrscheinlich die schnellste Lösung istpaste -d' | ' mydoc /dev/null /dev/null >mydoc2
paste
schreibt Zeilen aus jeder Datei. Ohne erhalten-s
Sie die Anzahl der Zeilen zurück, die Sie in der Datei haben.Antworten:
Mit sed, basierend auf Famous Sed Einzeiler erklärt, Teil I: : 39. Anfügen eine Zeile zum nächsten , wenn es mit einem Backslash endet „\“ (außer wir hier den Teil über den umgekehrten Schrägstrich zu ignorieren, und ersetzen die
\n
neue Zeilen mit der erforderliches|
Trennzeichen):sollte in produzieren
mydoc2
quelle
sed 'H;1h;$!d;x;s/\n/ | /g'
ist linear.sed
Musterbereich von 8 KB ; das sind viel weniger als 16 Millionen.Ich war neugierig zu sehen, wie einige dieser (+ einige Alternativen) mit einer ziemlich großen Datei (
163MiB
, 1 ) schnell funktionierenIP
pro Zeile, ~ 13 Millionen Zeilen) :Ergebnisse (mit
sync; echo 3 > /proc/sys/vm/drop_caches
nach jedem Befehl; ich wiederholte die Tests - in umgekehrter Reihenfolge - nach ein paar Stunden, aber die Unterschiede waren vernachlässigbar; beachte auch, dass ich verwendegnu sed
):Stahlfahrer :
Sehr langsam. Nach zwei Minuten Wartezeit abgebrochen ... also kein Ergebnis für diesen.
cuonglm :
mikeserv :
jdoch :
Avinash Raj :
und
val0x00ff :
was bedeutet
184.321s
. Es überrascht nicht, dass dies 200 Mal langsamer ist als die Lösung von mikeserv .Hier sind einige andere Möglichkeiten mit
awk:
perl:
xargs:
eine Kombination von Kopf + Paste + Tr + Katze:
Wenn Sie
GNU coreutils
IPs haben und Ihre IP-Liste nicht sehr umfangreich ist (sagen wir bis zu 50000 IPs), können Sie dies auch tun mitpr
:wo
zB für eine 6-zeilige Datei:
der Befehl:
Ausgänge:
quelle
while ... read
schleife hinzufügen ? Ich bin gespannt, was 163kread()
undwrite()
Calls in einem Benchmark bedeuten . Tolle Antwort übrigens.sed
sich das Ansehen in dieser Zeit verbessert hat (und wahrscheinlich nur sehr wenige Änderungen an der Regexp-Engine vorgenommen wurden) ,grep
die Leistung jedoch dramatisch nachgelassen zu haben scheint (insbesondere bei längeren Warteschlangen ) ? Ich frage mich, ob dieperl
Ergänzungen des Motors einen Einfluss auf diese Ergebnisse haben ... Es ist auch ordentlich, dassdash
es nicht miserabel ist . Dasbash
hier wäre wahrscheinlich weitaus langsamer w / das GemeinsameIFS=
vorangestellt.lex
richtig zu benutzen .Sie können awk verwenden :
ORS=' | '
Setzen Sie das Trennzeichen für Ausgabedatensätze auf' | '
anstelle von Newline.oder direkt bearbeiten mit
perl
:quelle
paste
funktioniert. sehr geschätzt.paste
lösung die schnellste.ORS=""
innerhalb desEND
Blocks durch ersetzenORS="\n"
, damit dies funktioniert.Ich hatte also alles falsch gemacht - und diese Frage hat mir viel beigebracht
paste
. Wie cuonglm richtig feststellt, wird immer die letzte Zeile aus Ihrer Infile-Liste an die Ausgabe angehängt , solange sie nicht inpaste
einer Datei-s
gespeichert\n
ist. Ich habe mich in der Annahme geirrt, dass daspaste -s
Verhalten der Standardmodus ist - und dies ist ein Missverständnis, das sich anscheinendbusybox
paste
gerne verstärkt hat. Der folgende Befehl funktioniert wie angekündigt mitbusybox
:Es funktioniert jedoch nicht nach Spezifikation. Eine korrekt implementierte
paste
würde immer noch eine\n
nachfolgende ewline für jede geschriebene Sequenz anhängen . Trotzdem ist das keine große Sache:quelle
pr
vor, aber anscheinend geht es mit riesigen Eingabedateien zur Neige, so dass ich die Geschwindigkeit nicht testen konnte, aber mit Dateien von angemessener Länge funktioniert es OK. Deine Lösung ist bei weitem die schnellste (keine Überraschung -paste
ist wirklich schnell), siehe meinen Beitrag.Nutzen Sie
vim
:Erläuterung:
-n
Auslagerungsdatei deaktivieren-u NONE
wird verwendet, um alle Initialisierungen zu überspringen.-c {command}
Befehle ausführen, nachdem die Datei gelesen wurde.1,$-1s/\n/ | /g
iss/\n/ | /g
(Zeilenvorschub durch Leerzeichen ersetzen) für den Bereich1,$-1s
(1. Zeile bis letzte Zeile - 1)wq!
Erzwinge das Schreiben und beende esHinweis:
Je nachdem, wie groß Ihre Datei wirklich ist, ist dies möglicherweise eine schlechte Idee.
quelle
Einzeiler mit tr und sed:
quelle
Durch Python.
Leerzeichen vorher
print
war sehr wichtig.quelle
Hier ist eine andere Verwendung
xxd
quelle
Der Vollständigkeit halber ist hier eine andere
awk
Lösung, dieORS
überhaupt nicht verwendet wird :Eine Erklärung finden Sie in meinem Beitrag unter /unix//a/338121/117599 .
quelle