Löschen Sie nachfolgende Kommas in der Zeile

10

Wie lösche ich eine Reihe von nachgestellten Kommas in bash:

a,b,c,d,,,,
1,2,3,,,,

Gewünschte Ausgabe:

a,b,c,d
1,2,3

Versucht dies zu tun:

 grep "5628" test.csv | sed 's/,*$//g'

aber es funktioniert nicht. Die Datei stammte ursprünglich von einem Windows-Computer.

user2980702
quelle
2
Bist du sicher, dass es nicht funktioniert hat? Welchen vollständigen Befehl haben Sie ausgeführt?
Cuonglm
Positiv. Es war nicht so.
user2980702
Können Sie bitte Ihren genauen Befehl angeben (der Befehl, den sedSie ohne Dateinamen angezeigt haben, fungiert als Filter und verarbeitet keine Datei an Ort und Stelle )
Roaima
grep "5628" test.csv | sed 's /, * $ // g'
user2980702
2
Wenn Sie die Datei in * nix verwenden müssen und nicht in der Lage sein müssen, sie zurück nach Windows zu kopieren, ist es auf lange Sicht möglicherweise einfacher, die Zeilenenden von CR / LF nach NL mit dos2unixoder ähnlichem zu konvertieren .
G-Man sagt 'Reinstate Monica'

Antworten:

13

Bezüglich des von Ihnen angegebenen Befehls:

grep "5628" test.csv | sed 's/,*$//g'

Dadurch werden Zeilen ausgegeben, die mit '5628' übereinstimmen, wobei alle nachgestellten Kommas entfernt werden. Die Datei wird nicht aktualisiert test.csv.

Sie haben jedoch angegeben, dass die Datei von einem Windows-Computer stammt, sodass die Zeilenenden CR / NL statt nur NL sind. Das Ergebnis ist, dass sich am Ende der Zeile eine versteckte CR befindet und Sie stattdessen eine Befehlszeile benötigen:

grep "5628" test.csv | sed 's/,*\r*$//'

Eigentlich können Sie dies einfach zu einem Befehl machen:

sed -n '/5628/s/,*\r*$//p' test.csv
Roaima
quelle
Ich versuche nicht, ein Update an Ort und Stelle durchzuführen.
Benötigen Sie
Das hat funktioniert. Vielen Dank. Wir suchen also nach mehreren Kommas (, *) vor dem Wagenrücklauf am Ende der Datei (\ r * $). Habe ich recht ?
user2980702
Dies \r*ermöglicht null oder mehr CR-Zeichen (daher funktioniert es weiterhin mit von Unix / Linux abgeleiteten Dateien). Ich würde es vorziehen, \r?eine einzelne optionale CR anzugeben, aber ich konnte mich nicht an die Flagge erinnern sed, um sie anzuweisen, EREs über meinem Kopf zu verwenden. Ich denke es ist hier -raber ungetestet. Das ,*gehört dir und entspricht null oder mehr Kommas.
Roaima
das gwird in diesem Fall nicht benötigt, ter ist nur 1 Ende angegeben durch$
NeronLeVelu
2
sed -n '/5628/ s/,*\r*$//p' test.csv

(nicht das OP, das nur nach dem Entfernen des nachlaufenden Komas fragt) Dies vermeidet einen Rohrleitungsprozess, bei dem der Filter und die Umwandlung direkt übernommen werden

NeronLeVelu
quelle