2017-09-28 4 views
0

ich wie mehrere Dateien mit Linien:Entfernen Sie alles in einer Linie vor dem Komma

foo, 123456 
bar, 654321 
baz, 098765 

Ich mag würde alles in jeder Zeile vor (einschließlich) das Komma entfernen. Ausgabe wäre:

123456 
654321 
098765 

ich versucht, die folgenden nach etwas ähnliches auf eine andere Frage zu sehen, aber der Benutzer hat keine Erklärung abgegeben, so dass ich bin mir nicht sicher, wie die Wildcard würde behandelt werden:

find . -name "*.csv" -type f | xargs sed -i -e '/*,/d' 

Vielen Dank für Ihre Hilfe.

Antwort

2

Methode 1: Wenn es immer die 2. Spalte, die Sie möchten, können Sie dies mit awk - dieser Befehl tatsächlich die Zeilen auf dem Leerzeichen statt dem Komma Aufspalten, so wird es Ihre zweite Säule - die Zahlen, aber ohne den führenden Raum:

awk '{print $2}' < whatever.csv 

Methode 2: Oder alles nach dem Komma (einschließlich th zu bekommen e Raum):

sed -e 's/^.*,//g' < whatever.csv 

Methode 3: Wenn Sie alle der .csv Dateien zu suchen und die Ausgabe von ihnen allen zusammen zu bekommen, können Sie tun:

sed -e 's/^.*,//g' `find . -name '*.csv' -print` 

Methode 4: Oder auf die gleiche Weise zu beginnen wurden - mit und xargs finden:

find . -name '*.csv' -type f -print | xargs sed -e 's/^.*,//' 

Methode 5: machen alle die CSV Dateien in.txt Dateien, die auf die oben beschriebene Weise verarbeitet werden, können Sie ein kurzes Shell-Skript erstellen. Wie folgt aus:

Erstellen Sie ein Skript "bla.sh":

#!/bin/sh 
for infile in `find . -name '*.csv' -print` ; do 
     outfile=`echo $infile | sed -e 's/.csv/.txt/'` 
     echo "$infile --> $outfile" 

     sed -e 's/^.*,//g' < $infile > $outfile 
done 

ausführbar machen, indem diese eingeben:

chmod 755 bla.sh 

Dann ist es laufen:

./bla.sh 

Dies erzeugt einen .txt Ausgang Datei mit allem nach dem Komma für jede .csv Eingabedatei.

alternative Methode 5: Oder wenn Sie sie brauchen, wie dies namentlich genannt werden .csv könnte das Skript aktualisiert werden - das macht nur eine Ausgabe Datei mit dem Namen „Datei-new.csv“ für jede Eingabedatei "file.csv" genannt:

#!/bin/sh 
for infile in `find . -name '*.csv' -print` ; do 
    outfile=`echo $infile | sed -e 's/.csv/-new.csv/'` 
    echo "$infile --> $outfile" 

    sed -e 's/^.*,//g' < $infile > $outfile 
done 
+0

Was ist, wenn es mehrere Dateien sind? –

+1

Möchten Sie die Ausgabe in neue Dateien zurückgeben oder nur auf dem Bildschirm ausgeben? – drewster

+0

neue Dateien, gleicher Name –

1

So etwas sollte für eine einzelne Datei funktionieren. Nehmen wir an, der Eingang ist "yourfile" und Sie möchten, dass die Ausgabe in "outfile" geht.

sed 's/^.*,//' <yourfile> outfile 

Die Syntax eine Suche und Ersetzen zu tun ist, s/input_pattern/replacement/

Die ^ Anker das Eingangsmuster zu dem Anfang der Zeile.

Ein Punkt . entspricht einem einzelnen Zeichen; .* entspricht einer Zeichenfolge von null oder mehr beliebigen Zeichen.

Die , entspricht dem Komma.

Das Ersetzungsmuster ist leer, also wird alles, was mit dem Eingabemuster übereinstimmt, entfernt.

+0

Was passiert, wenn es mehrere Dateien ist? –

Verwandte Themen