2016-08-05 11 views
0

私は恐ろしいテキストデータ(2GBのcsvファイル)から作業しています。実際にはすべてのエスケープ文字0x00-0x1Fがファイル全体に含まれています。私は(0x04の)処理のためにRにこれを読んしようとしましたが、のEOFに起因することはできません。sedのエスケープ/非印字可能な文字の範囲を削除

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

だから私は、sedのは、ファイル内のすべての非印刷可能なジャンクを削除するには良いの使用だろうと思ったが、そこに思えますsedの構文でエスケープ文字をどのように表現するかには、ある種の不自然さがあります。私は仕事していないようですこれ以下の全てを試してみました:

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 

と使用:

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

は、10進数または16進数で印刷不能の範囲を特定します

は、必ず指定の文字を含めます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つの範囲内で同時に印刷不可能な文字をすべて解決するには、印刷できない文字ごとに1つのコマンドを実行する必要はありませんか?私は、範囲の構文を正しく入力してはならないと仮定します。

+0

'[^ - 〜\ t \ r \ n]'のようなものを試しましたか?または '[^ [:space:]! - 〜]' –

+1

印字可能な文字にPOSIX文字クラスの否定を使用しようとしましたか: ''/[^ [:print:]] // g '文字 '/ 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

ありがとう、私は2番目の[: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が削除したい文字を誤解しています。 –

関連する問題