![0d Wagenrücklauf aus CSV-Datei löschen](https://rvso.com/image/109230/0d%20Wagenr%C3%BCcklauf%20aus%20CSV-Datei%20l%C3%B6schen%20.png)
Bei der Arbeit mit einem Skript habe ich dieses Problem. Wenn ich das Skript ausführe, erhalte ich meistens diese Ausgabedatei:
device_id,ip_address,serial_number
SEP0c1167231746, 148.000.000.32
SEP0c1167223fa5, 148.000.000.30
SEP0c1167224170, 148.000.000.30
SEP0c1167231d2e, 148.000.000.194
SEP0c1167233b9f, 148.000.000.31
CUV, 148.000.000.254
SEP0c1167231d32, 148.000.000.34
SEP501cbffcfa9c, 148.000.000.24
SEP00082fb67d5f, 148.000.000.21
SEP00082fb67701, 148.000.000.22
Und das ist genau das, was ich erwarte, aber gelegentlich sieht die Datei so aus:
device_id,ip_address,serial_number
SEP0c1167231746
, 148.000.000.32
SEP0c1167223fa5
, 148.000.000.30
SEP0c1167224170
, 148.000.000.30
SEP0c1167231d2e
, 148.000.000.194
SEP0c1167233b9f
, 148.000.000.31
CUV
, 148.000.000.254
SEP0c1167231d32
, 148.000.000.34
SEP501cbffcfa9c
, 148.000.000.24
SEP00082fb67d5f
, 148.000.000.21
SEP00082fb67701
, 148.000.000.22
Ich habe versucht, herauszufinden, was los ist, aber es scheint nichts Gewöhnliches zu sein. Jetzt möchte ich nur noch damit klarkommen. Mithilfe von Ghex habe ich das Zeichen identifiziert, das das Problem verursacht.
Nun möchte ich alle "0D" durch Null ersetzen und alle "0A" behalten
nur als Hinweis, ich habe versucht, „dos2unix“ zu verwenden, aber es hat nicht funktioniert.
Kannst du mir helfen?
UPDATE: Verwenden von: sed -n -e '/,/!{N;s/\n//;}; /,/p' Eingabe
mit einer Datei wie dieser:
device_id,ip_address,serial_number
SEP0c1167231746
, 148.000.000.32
,
SEP0c1167223fa5
, 148.000.000.30
,
SEP0c1167224170
, 148.000.000.30
,
SEP0c1167231d2e
, 148.000.000.194
,
SEP0c1167233b9f
, 148.000.000.31
,
CUV
, 148.000.000.254
,
SEP0c1167231d32
, 148.000.000.34
,
SEP501cbffcfa9c
, 148.000.000.24
,
SEP00082fb67d5f
, 148.000.000.21
,
SEP00082fb67701
, 148.000.000.22
Ich habe diese Ausgabe erhalten:
, 148.000.000.32
, 148.000.000.30
, 148.000.000.30
, 148.000.000.194
, 148.000.000.31
, 148.000.000.254
, 148.000.000.34
, 148.000.000.24
, 148.000.000.21
, 148.000.000.22
Antwort1
Es gibt möglicherweise eine bessere sed
Option, aber hier ist eine:
sed -n -e '/,/!{N;s/\n//;}; /,/p' input > output
Es heißt (standardmäßig, Zeilen werden nicht gedruckt): Wenn in der Zeile ein Komma steht, dann lies dienächsteZeile ein und ersetzen Sie die neue Zeile. Wenn die Zeile dann (jetzt oder bereits) ein Komma enthält, drucken Sie die Zeile aus. Sie liest von input
und schreibt in output
. Bei einigen Seds können Sie das Flag von sed verwenden, -i
um die Datei direkt zu bearbeiten.
Beispieleingabe:
device_id,ip_address,serial_number
SEP0c1167231746, 148.000.000.32
SEP0c1167223fa5, 148.000.000.30
SEP0c1167231746
, 148.000.000.32
SEP0c1167223fa5
, 148.000.000.30
Beispielausgabe:
device_id,ip_address,serial_number
SEP0c1167231746, 148.000.000.32
SEP0c1167223fa5, 148.000.000.30
SEP0c1167231746, 148.000.000.32
SEP0c1167223fa5, 148.000.000.30
Antwort2
Wenn man sich Ihren Hexdump ansieht, scheint es, dass dies Ihr Problem beheben sollte:
tr -d '\015' < input > log
\015
Das Zeichen ist wie das Oktalzeichen carriage return
^M
.
Warum dos2unix
hat es nicht geholfen, liegt daran, dass dos2unix
es sich die Sequenz ansieht \r\n
, die in Ihrem Fall nicht vorhanden ist.