2016-07-25 115 views
0

我遇到了一個問題,我在開始時在文件中收到一些特殊字符;下同瞬間:特殊字符刪除'sed'

^@<9b>200931350515,test1,910,420032400825443 
^@<9a>200931350515,test1,910,420032400825443 
^@<9d>200931746996,test2,910,420031390086807 

我使用下面的命令來刪除第一列數字以外的東西:

sed 's/^[^0-9]*//g' file.dat 

上沒有成功。該文件是在Teradata的一個緊固端口上創建的,該過程在提取過程中自己添加了一些特殊字符。

該命令的任何想法?

+0

它是否每行總是添加相同數量的字符? –

+2

也可以在上面的行中獲得十六進制輸出(例如使用'xxd') –

回答

2

如果您想刪除一行中任何位置的任何非ASCII字符,可以使用tr

tr -d '\000\200-\377' <file >file.new 
0

sed就是大槍,這樣一個小問題, 使用cut刪除每個行的開頭:

cut -b 2- file.dat 

哪裏2-是要保留的字節的範圍,我不知道你有多少這樣奇怪的字符都在那裏,所以我會1-2-3-4-5-實驗等

+0

謝謝@krzyk。我應該提到創建的文件非常龐大(> 500GB)。此外,添加的字符數量也不是恆定的。有些行有4個,大約6個,只有3個。 所以,在這裏削減並不是一個更好的選擇;對於大文件也是不可行的。 即使sed在如此龐大的文件中也需要時間。例如:在一個439GB的文件上花費了4個小時,相同類型的操作。 – knowone

+0

對於這種情況''cut''比'sed'更快,但是當字符數量可變時(通常情況下,如果你有更大的文件,在不需要時避免使用regexes)。其他不錯的選擇是'tr'由三重答案 –

0

看起來應該被刪除的字符數在所有生產線上保持不變。從各行開頭刪除字符固定數量的,你可以簡單地做

$ sed 's/^.....//' input >output 

調整點的數量,以滿足您的需要。

+1

我會很感激評論與反對票。這些字符在每行的開頭,並且在每行中似乎是相同的。我的答案中的'sed'腳本將從每行的開頭刪除字符。這有問題嗎? – Kusalananda

+0

我同意並添加了一個句子。我希望現在大家都清楚...... – hek2mgl

+0

@ hek2mgl感謝您的編輯。 – Kusalananda

1

使用perl

perl -lne 'print /\d+,.*/g' 

200931350515,test1,910,420032400825443 
200931350515,test1,910,420032400825443 
200931746996,test2,910,420031390086807 

只匹配數字到第一個逗號,然後一切。

+0

這工作奇蹟。謝謝!! – knowone