Drehen Sie multi-line string in einzelne Komma-getrennt
Sagen wir, ich habe folgenden string:
something1: +12.0 (some unnecessary trailing data (this must go))
something2: +15.5 (some more unnecessary trailing data)
something4: +9.0 (some other unnecessary data)
something1: +13.5 (blah blah blah)
Wie schalte ich das in einfach
+12.0,+15.5,+9.0,+13.5
in der bash?
- Lassen Sie uns Schritt zurück für einen moment und überlegen, diesen thread ein krasses Armutszeugnis für die bash als Programmiersprache. Betrachten Scala
listOfStuff mkString ", "
oder Haskell istintercalate ", " listOfString
- Verwandte: Konvertieren von text-Datei in eine kommagetrennte Zeichenfolge
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie
awk
undsed
:Oder wenn Sie möchten, verwenden Sie ein Rohr:
Um es zu brechen:
awk
ist Super im Umgang mit Daten, aufgeschlüsselt nach Bereichen-vORS=,
setzt den "output record separator" zu,
, was Sie wollte{ print $2 }
sagtawk
zu drucken, das zweite Feld für jeden Datensatz (Zeile)file.txt
ist Ihr mit dem Namensed
nur entledigt sich der nachfolgende,
und verwandelt es in ein newline (wenn Sie kein newline, die Sie tun könnens/,$//
)awk -v ORS=| '{ print $1 }' DCMC.rtf | sed 's/,$/\n/'
erhalte eine Fehlermeldung{ print $1 }
Sauber und einfach:
function | awk...
in deinem Beispiel?Diese sollten auch funktionieren
Könnte dies für Sie arbeiten:
oder
oder
Für jede Zeile in der Datei; hacken aus dem ersten Feld von Leerzeichen nach, schneidet den Rest der Zeile nach dem zweiten Feld und fügen Sie den Frachtraum. Löschen Sie alle Zeilen außer der letzten, wo wir wechseln den Raum und nach dem löschen der eingeführt newline am Anfang, konvertieren alle Zeilenumbrüche zu
,
's.N. B. geschrieben werden Konnte:
awk one-liner
versuchen Sie dies:
das gute ist, das Teil einfach zu löschen newline "\n" - Zeichen!
EDIT: ein weiterer guter Weg, um die join-Zeilen zu einer Zeile mit sed, ist dies:
|sed ':a;N;$!ba;s/\n//g'
bekam von hier.Können Sie
grep
:findet die Zeichenfolge beginnend mit
+
, gefolgt von einer beliebigen Zeichenfolge\S\+
, dann konvertieren, neue-Zeile-Zeichen in Anführungszeichen. Dieser sollte ziemlich schnell für große Dateien.Lösung geschrieben in reines Bash:
Ergebnis: +12.0,+15.5,+9.0,+13.5
Nicht gesehen, diese einfache Lösung mit awk
Mit perl:
Kann man es auch mit zwei sed-Aufrufe:
Erste sed-Aufruf entfernt uninteressante Daten, und der zweite join alle Zeilen.
Können Sie auch drucken, wie diese:
Nur awk: mit printf
Anderen Perl-Lösung, ähnlich wie Dan Fego ' s awk:
-a
sagt perl aufteilen der Eingabezeile in das @F-array, die indiziert, beginnend bei 0.Sowie der schwierigste Teil ist wahrscheinlich die Auswahl der zweiten "Spalte", da ich nicht weiß, wie man am einfachsten zu behandeln sind mehrere Räume als ein. Für den rest ist es einfach. Verwenden die bash-Substitutionen.