.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 を使用して問題の原因となっている文字を特定しました。

ここに画像の説明を入力してください

ここで、すべての「0D」をNullに置き換え、すべての「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、 に書き込みます。一部の sed では、sed のフラグを使用してファイルをその場で編集outputできます。-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

16 進ダンプを見ると、これで問題は解決すると思われます:

tr -d '\015' < input > log

8進数は文字\015ですcarriage return ^M

dos2unix役に立たなかった理由は、あなたのケースには存在しないdos2unixシーケンスを調べるからです。\r\n

関連情報