2016-07-25 117 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