mudando o padrão removendo espaços?

2
arquivo

:

hi hello,new york,      ,  ,brazil site   ,brazil
january,month is feb   ,      , ,indiana jones
tarefa

:

  • exclua todo o espaço horizontal (espaços e tabulação) entre quaisquer dois comas (como,) se não houver nenhum caractere diferente de espaço. então ficaria assim:

    hi hello,new york,,,brazil site   ,brazil
    january,month is feb   ,,,indiana jones
    
  • também, exclua qualquer espaço horizontal à direita ou à esquerda (espaço e tabulação) para cada parâmetro para que fique assim.

    saída final:

    hi hello,new york,,,brazil site,brazil
    january,month is feb,,,indiana jones
    

NOTA: Os próprios parâmetros têm espaços como hi hello e indiana jones etc. Ele não deve ser afetado e se tornar como hihello ou indianajones . Se possível, uma solução com o awk, caso contrário, o sed também funcionará.

Não consigo realizar a primeira tarefa com sed assim:

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

mas eu recebo isso como saída:

january,month is feb   ,      ,,indiana jones
    
por munish 27.02.2013 / 09:06

2 respostas

3

Existem três possibilidades com o sed:

  1. O mais simples (correspondendo a um caractere de espaço zero ou mais vezes antes de uma vírgula e um caractere de espaço zero ou mais vezes após a vírgula, substituindo-o por apenas uma vírgula - e isso muitas vezes, usando a opção g global ):

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

    Tempo para este comando: 3.056s, com perl -p -e em vez de sed 5.932s

  2. [:space:] significa todos os caracteres de espaço em branco, sendo assim o mesmo que [ \t\r\n\v\f] . Este é o padrão POSIX :

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

    Tempo para este comando: 10.365s, com perl -p -e em vez de sed 9.060s

  3. E, finalmente, a versão abreviada com \s , que significa o mesmo que [:space:] , mas é Sintaxe do Perl :

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

    Tempo para este comando: 10.507s, com perl -p -e em vez de sed 6.126s

Todos resultam em

hi hello,new york,,,brazil site,brazil
january,month is feb,,,indiana jones

O tempo foi usado para um arquivo com 2 milhões de linhas (contendo o texto do exemplo das perguntas 1 milhão de vezes). O arquivo tinha 97MBytes de tamanho.

O primeiro comando parece ser o mais rápido com sed . O último comando é o mais rápido ao usar perl e levando em conta que substitui não apenas espaços, mas também tabstops, linefeed e assim por diante.

    
por 01.03.2013 / 07:09
4

Então, você está perguntando ao awk:

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

Isso acontecerá? Observe que isso tem o efeito colateral de remover espaço duplicado em seus dados dentro de vírgulas, o que pode não ser um problema para o inglês.

    
por 01.03.2013 / 05:35