スペースを削除してパターンを変更しますか?

スペースを削除してパターンを変更しますか?

文書:

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のスペースがあり、これは影響を受けてはいけませhihelloindianajones。可能であれば awk を使って解決し、そうでなければ sed を使うこともできます。

次のようにsedを使用して最初の操作を実行することはできません。

sed -n 's/,[[:blank:]],/,,/gp' file

しかし、私はこれを出力として取得します。

january,month is feb   ,      ,,indiana jones

答え1

だからあなたはawkに尋ねています:

awk '{$1=$1};gsub(" ,",",")'

大丈夫ですか?これは、データからカンマ内の空白を繰り返すという副作用があり、これは英語では問題にならない可能性があります。

答え2

sedには3つの可能性があります。

  1. g最も簡単なもの(カンマの前の空白文字と0回以上一致し、コンマの後の空白文字と0回以上一致し、単にコンマで置き換えるので複数回使用するため、オプションを使用してください)グローバル):

    sed 's/ *, */,/g' file
    

    このコマンドの実行時間:5.932秒perl -p -eではなく3.056秒sed

  2. [:space:]すべての空白文字を表すので、 と同じです[ \t\r\n\v\f]これがPOSIX標準です:

    sed 's/[[:space:]]*,[[:space:]]*/,/g' file
    

    このコマンドの実行時間:9.060秒perl -p -eではなく10.365秒sed

  3. \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を使用するときに最も速く、スペースだけでなくタブの停止、改行などを置き換えることを検討してください。

関連情報