2016-08-05 5 views
0

Я работаю от ужасных текстовых данных (2GB csv-файла), который включает практически все escape-символы 0x00-0x1F, забрызганные по всему файлу. Я попытался прочитать в R для обработки, но не может из-за ЭОФ (0x04):Удалите ряд escape/непечатаемых символов в sed

Warning message: 
    In scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings, : 
     EOF within quoted string 

Так я думал, СЭД будет хорошо использовать, чтобы удалить все непечатаемую мусор в файле, но там, кажется быть некоторой странностью в том, как представлять символы побега в синтаксисе sed. Я попытался все следующие, которые не похоже на работу:

Включить только указанные символы:

sed 's/[^a-zA-Z 0-9`[email protected]#$%^&*()_+\[\]\\{}|;'\'':",.\/<>?]//g' IN.csv > OUT.csv 

Определить диапазон непечатаемых в десятичной или шестнадцатеричной:

cat IN.csv | sed 's/[\d0-\d31]//g' > OUT.csv 

    cat IN.csv | sed s/[$'\x00'-$'\x1F']//g OUT.csv 

    cat IN.csv | sed 's/\x00-\x1F//g' > OUT.csv 

и используя Ctrl-VCtrl-D, чтобы произвести это:

cat IN.csv | sed s/^D//g > OUT.csv 

Все команды, как представляется, выполняются, но результирующий вывод файла не удаляет непечатаемые символы и, как представляется, изменяет результат неожиданным образом.

То, что я обнаружил, что это работает так:

cat IN.csv | sed 's/'`echo -e "\x04"`'//g' > OUT.csv 

или это:

cat IN.csv | sed 's/\x04//g' > test3.csv 

Однако это работает только для одного побега полукокса. Есть ли лучший способ адресовать все непечатаемые символы одновременно в одном диапазоне без необходимости выполнять 1 команду для каждого непечатаемого? Я предполагаю, что я не должен правильно вводить синтаксис диапазона.

+0

Вы пытались что-то вроде '[^ - ~ \ t \ r \ n]'? или '[^ [: space:]! - ~]' –

+1

Вы пытались использовать отрицание класса символов POSIX для печатаемых символов: '' s/[^ [: print:]] // g'' или для управления characters '' s/[[: cntrl:]] // g''? –

+0

Спасибо. Было похоже, что файл s// [[: cntrl:]] // g 'работает, однако размеры файлов между этой и [: print:] версиями несколько отличались.Возможно, мне придется исследовать различия между ними. –

ответ

2

Для удаления (и транслитерации) есть лучший инструмент под названием tr (перевод или удаление символов). Вы можете удалить непечатаемые символы с помощью:

cat IN.csv | tr -cd '\11\12\15\40-\176' > OUT.csv 

-d - удаляет символы, указанные, -c инвертирует диапазоны.

Или с помощью POSIX [:print:]:

cat IN.csv | tr -cd '[:print:]' > OUT.csv 
+0

Спасибо, я использовал второй оператор [: print:], и он, похоже, сработал. –

0

Вы можете попробовать awk:

awk '{gsub(/[[:punct:]]/,"")}1' your_file 

или попробовать sed:

sed "s/[^a-z|0-9]//g;" orig_file > new_file 

или попробовать Perl:

perl -pe 's/[^A-Za-z0-9\s]//g' orig_file > new_file 
+0

Вы неправильно поняли, какие символы OP хочет удалить. –

Смежные вопросы