文書:
hi hello,new york, , ,brazil site ,brazil
january,month is feb , , ,indiana jones
仕事:
スペース以外の文字がない場合、2つのカンマ(たとえば、、)の間の水平スペース(スペースとタブ)はすべて削除されます。だからそれは次のようになります:
hi hello,new york,,,brazil site ,brazil january,month is feb ,,,indiana jones
また、各引数から末尾または前の水平スペース(スペースとタブ)を削除して、次のように見えます。
最終出力:
hi hello,new york,,,brazil site,brazil january,month is feb,,,indiana jones
注:パラメータ自体にはhi hello
などindiana jones
のスペースがあり、これは影響を受けてはいけませhihello
んindianajones
。可能であれば awk を使って解決し、そうでなければ sed を使うこともできます。
次のようにsedを使用して最初の操作を実行することはできません。
sed -n 's/,[[:blank:]],/,,/gp' file
しかし、私はこれを出力として取得します。
january,month is feb , ,,indiana jones
答え1
だからあなたはawkに尋ねています:
awk '{$1=$1};gsub(" ,",",")'
大丈夫ですか?これは、データからカンマ内の空白を繰り返すという副作用があり、これは英語では問題にならない可能性があります。
答え2
sedには3つの可能性があります。
g
最も簡単なもの(カンマの前の空白文字と0回以上一致し、コンマの後の空白文字と0回以上一致し、単にコンマで置き換えるので複数回使用するため、オプションを使用してください)グローバル):sed 's/ *, */,/g' file
このコマンドの実行時間:5.932秒
perl -p -e
ではなく3.056秒sed
[:space:]
すべての空白文字を表すので、 と同じです[ \t\r\n\v\f]
。これがPOSIX標準です:sed 's/[[:space:]]*,[[:space:]]*/,/g' file
このコマンドの実行時間:9.060秒
perl -p -e
ではなく10.365秒sed
\s
最後に、次のものと同じですが、意味する短縮バージョンがあります。[:space:]
Perl構文:sed 's/\s*,\s*/,/g' file
このコマンドの実行時間:6.126秒
perl -p -e
ではなく10.507秒sed
これらすべてが次に続くでしょう。
hi hello,new york,,,brazil site,brazil
january,month is feb,,,indiana jones
これ時間200万行のファイルとして扱われます(100万の質問サンプルテキストを含む)。ファイルサイズは97MBです。
最初のコマンドが最も速いようですsed
。最後のコマンドはPerlを使用するときに最も速く、スペースだけでなくタブの停止、改行などを置き換えることを検討してください。