スクリプトを使用すると、この問題が発生しました。ほとんどの場合、スクリプトを実行すると、次の出力ファイルが表示されます。
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
ここに1つあります。
sed -n -e '/,/!{N;s/\n//;}; /,/p' input > output
(デフォルトでは行は印刷されません):行にカンマがある場合は、次をお読みください。Next改行文字をラップして置き換えます。次に、その行(現在またはすでに)にカンマがある場合は、その行を印刷します。で読み書き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
16進ダンプを見ると、次のように問題が解決するようです。
tr -d '\015' < input > log
8進数は文字である\015
ためです。carriage return
^M
役に立たない理由はdos2unix
、あなたのケースに存在しないシーケンスを見るからですdos2unix
。\r\n