从.csv文件中删除0d回车符

从.csv文件中删除0d回车符

使用脚本时我遇到了这个问题,大多数时候当我运行脚本时,这是我得到的输出文件:

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

这正是我所期望的,但有时文件看起来像这样:

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

我试图弄清楚发生了什么,但它似乎不正常,现在我只想处理这个问题,使用 Ghex 我已经识别出导致问题的字符。

在此输入图像描述

现在我想用 Null 替换所有“0D”并保留所有“0A”

作为一个注释,我尝试使用“dos2unix”,但它不起作用。

你可以帮帮我吗?

更新:使用: sed -n -e '/,/!{N;s/\n//;}; /,/p'输入

与这样的文件:

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

我有这个输出:

, 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

答案1

可能有更好的sed选择,但这里有一个:

sed -n -e '/,/!{N;s/\n//;}; /,/p' input > output

它说,(默认情况下,不打印行):如果行中有逗号,则读取下一个换行并替换换行符。然后,如果该行中(现在或已经)有逗号,则打印该行。它从 读取input并写入output。对于某些 sed,您可以使用 sed 的-i标志就地编辑文件。

输入示例:

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

示例输出:

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

答案2

查看您的十六进制转储,这似乎应该可以解决您的问题:

tr -d '\015' < input > log

因为八进制\015carriage return ^M字符。

为什么dos2unix没有帮助是因为查看您的案例中不存在的dos2unix序列。\r\n

相关内容