0d Wagenrücklauf aus CSV-Datei löschen

0d Wagenrücklauf aus CSV-Datei löschen

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.

Bildbeschreibung hier eingeben

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 sedOption, 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 inputund schreibt in output. Bei einigen Seds können Sie das Flag von sed verwenden, -ium 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

\015Das Zeichen ist wie das Oktalzeichen carriage return ^M.

Warum dos2unixhat es nicht geholfen, liegt daran, dass dos2unixes sich die Sequenz ansieht \r\n, die in Ihrem Fall nicht vorhanden ist.

verwandte Informationen