Das erste Leerzeichen in einer Zeile entfernen

7

Wie kann ich nur das erste Leerzeichen aus einer Zeile wie der folgenden entfernen, ohne die anderen Leerzeichen in derselben Zeile zu entfernen?

Beispiel Eingabe:

2015-04-18 10:21:59 10 05430 -9999 -9999 000000000000

Beispielausgabe:

2015-04-1810:21:59 10 05430 -9999 -9999 000000000000
ThehalfarisedPheonix
quelle

Antworten:

2

Verwenden von awk:

> awk '{print $1$2,$3,$4,$5,$6,$7}' yourfile > outputfile

Die Ausgabe:

> cat outputfile

2015-04-1810:21:59 10 05430 -9999 -9999 000000000000

Sie können jedes Leerzeichen in der Zeile entfernen und jedes behalten

Angenommen : Die Eingabedatei muss enthalten:

  1. kein führendes Leerzeichen
  2. Keine aufeinander folgenden Leerzeichen
  3. keine Tabs
  4. insgesamt weniger als sieben Plätze

Wenn eine dieser Annahmen verletzt wird, ist das Ergebnis nicht korrekt

Wissam Roujoulah
quelle
7
Herabgestuft, da dies völlig von den folgenden Annahmen abhängt: Die Eingabedatei darf (1) kein führendes Leerzeichen (2) keine aufeinander folgenden Leerzeichen (3) keine Tabulatoren (4) insgesamt weniger als sieben Leerzeichen enthalten. Wenn eine dieser Annahmen verletzt wird, führt der Befehl etwas ganz anderes aus als die angeforderte Aktion: "Entfernen Sie das erste Leerzeichen aus jeder Zeile (ohne weitere Änderungen)."
Wildcard
1
Die richtige Lösung wurde veröffentlicht . Diese Antwort ist wirklich nicht richtig.
Wildcard
4
Denken Sie daran, dass diese Website für zukünftige Leser gedacht ist, nicht nur für den aktuellen Fragesteller. Dies ist also eine sehr irreführende Antwort auf die Frage: "Wie entferne ich das erste Leerzeichen aus jeder Zeile meiner Datei?" Zumindest sollten Sie die Annahmen nach der Antwort mit einem Hinweis, Warnungen, versehen.
Wildcard
2
@ Wildcard wieder hast du recht, ich habe meine Antwort bearbeitet.
Wissam Roujoulah
3
Anstelle all dieser Ausführlichkeit hätten Sie auch eine sub()Funktion verwenden können, die nur die erste Übereinstimmung in der Zeile entfernt, sodass Ihr langer awk-Ausdruck aufawk '{sub(/ /,"")};1' input.txt
Sergiy Kolodyazhnyy
19

Sie können dafür verwenden sed:

sed 's/ //' infile >outfile

Dies wendet eine Ersetzung auf alle Zeilen der Datei an infile, die das erste Leerzeichen durch nichts ersetzen (dh entfernen). Die Ausgabe wird in der Datei gespeichert outfile. Mit sed 's/ //N', wo Neine Ganzzahl zwischen 1 und 9 liegt, können Sie auswählen, welches Leerzeichen entfernt werden soll.

Wenn sich die Zeile in einer Shell-Variablen befindet, können Sie verwenden

var="${var/ /}"

Dies verwendet die ${parameter/pattern/string}Parametererweiterung in bash, um dasselbe wie der sedBefehl zu tun , jedoch für den Wert in $var. Die resultierende Zeichenfolge wird in diesem Beispiel wieder in gespeichert $var.

Kusalananda
quelle
1

Sie können Vim im Ex-Modus verwenden:

ex -sc '%s/ //|x' file
  1. % Wählen Sie alle Zeilen aus

  2. s Ersatz

  3. x speichern und schließen

Steven Penny
quelle
0

Kleiner und einfacher Perl Einzeiler:

$ perl -ane 'printf "%s",@F[0];@F[0]="";print @F'  <<< "2015-04-18 10:21:59 10 05430 -9999 -9999 000000000000"                        
2015-04-1810:21:591005430-9999-9999000000000000

Oder noch einfacher, wie von mik in den Kommentaren vorgeschlagen:

perl -pe 's/ //' <<< "2015-04-18 10:21:59 10 05430 -9999 -9999 000000000000"

Python kann es auch. Hier ist ein kleines Skript, das die Arbeit erledigt. Bei Bedarf kann es auf einen Einzeiler reduziert werden:

#!/usr/bin/env python
from __future__ import print_function
import sys
for line in sys.stdin:
    words=line.strip().split()
    print(words[0],end="")
    print(" ".join(words[1:]))

Und da dieselbe Zeile in der Eingabedatei dreimal dupliziert wurde, ist hier ein Test für mehrzeilige Eingaben:

$ ./remove_leading_space.py < input.txt                                                                                               
2015-04-1810:21:59 10 05430 -9999 -9999 000000000000
2015-04-1810:21:59 10 05430 -9999 -9999 000000000000
2015-04-1810:21:59 10 05430 -9999 -9999 000000000000

Wenn Sie nur eine einzelne Zeile bearbeitet haben, können Sie dies folgendermaßen tun:

$ ./remove_leading_space.py <<< "2015-04-18 10:21:59 10 05430 -9999 -9999 000000000000"                                               
Sergiy Kolodyazhnyy
quelle
1
Ein kleiner und einfacher perlOneliner wäreperl -pe 's/ //'
mik
@mik Danke. In die Antwort bearbeitet. Ich lerne immer noch Perl, also tue ich
mein
-1

Das ist eine ganz einfache Frage.

sed -i 's/ //' /path/to/file

Versuchen Sie diesen Befehl und fügen Sie am Ende des sed-Ausdrucks kein s hinzu .

Es wird nur das erste Leerzeichen in jeder Zeile entfernt.

TJM
quelle
2
Wie unterscheidet sich das von Kusalananda?
don_crissti
@don_crissti während -iSie verwenden, können Sie weniger eingeben . Und -iist der offiziell empfohlene Weg, wenn Sie nur Textdateien direkt ändern möchten.
TJM
3
Ja, der nächste Typ wird ein hinzufügen -eund sagen, dass es auch anders ist ...
don_crissti
@don_crissti Warum nicht? Ich denke, es wird hilfreichere Informationen für diejenigen Menschen liefern, die wie der Fragesteller in Schwierigkeiten sind.
TJM