從.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

相關內容