![.csv ファイルから 0d 改行を削除する](https://rvso.com/image/109230/.csv%20%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%8B%E3%82%89%200d%20%E6%94%B9%E8%A1%8C%E3%82%92%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B%20.png)
スクリプトを操作しているときにこの問題が発生しました。ほとんどの場合、スクリプトを実行すると、次のような出力ファイルが生成されます。
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