Tabela delimitada por espaço em branco para CSV com ferramentas de processamento de texto padrão

1

Eu tenho a seguinte tabela de dados:

ssh     22/tcp  0.182286        # Secure Shell Login
linuxconf   98/tcp  0.000088 
tacnews    98/udp   0.000560    # TAC News

do qual desejo gerar um arquivo CSV no seguinte formato:

ssh,22,tcp,Secure Shell Login
linuxconf,98,tcp,
tacnews,98,udp,Tac News

Estou descartando o número decimal fracionário e incluindo a descrição sem o '#', se existir.

Eu vejo os dados como um monte de campos (perdoe o faux regex):

^{1}\s+{2}/{3}\s+{4}\s+# {5}$  

Para o qual eu enviaria:

{1},{2},{3},{5}  

Qual seria a ferramenta mais simples e mais apropriada para fazer isso? Ficaria muito grato pela ajuda com a sintaxe para conseguir isso.

    
por user1330734 10.11.2016 / 15:49

2 respostas

2

A melhor ferramenta para algo assim é provavelmente sed , aqui está um exemplo de trabalho usando expressões regulares estendidas:

sed -E 's:^([^ ]*)\s+([^/]*)/([^ ]*)\s+[^ ]*\s*#?\s*(.*):,,,:' file

Ou se sua entrada puder ser delimitada por tabulações:

sed -E 's:^([^[:space:]]*)\s+([^/]*)/([^[:space:]]*)\s+[^[:space:]]*\s*#?\s*(.*):,,,:' file

Saída:

ssh,22,tcp,Secure Shell Login
linuxconf,98,tcp,
tacnews,98,udp,TAC News

Explicação

  • s::: usa dois pontos como o delimitador de expressão
  • ^([^ ]*) primeiro grupo de captura, sequência de correspondência de caracteres não espaciais no início da linha
  • \s+ ignora o espaço
  • ([^/]*) segundo grupo de captura, correspondência até uma barra
  • / ignorar barra
  • ([^ ]*) terceiro grupo de captura, sequência de correspondência de caracteres não espaciais
  • \s+ ignora o espaço
  • [^ ]* ignora o número decimal
  • \s*#?\s* ignora o espaço e o hash opcional
  • (.*) quarto grupo de captura, o resto da linha
por 10.11.2016 / 16:00
2

Eu usaria o perl: você tem o regex esboçado, isso preenche as lacunas.

perl -lne '
    / (\S+)     \s+      # non-whitespace followed by whitespace
      (\d+)     \/       # digits followed by slash
      (\S+)     \s+      # non-whitespace followed by whitespace
      (\S+)     \s*      # non-whitespace followed by optional whitespace
      (?:\#\s)? (.*)     # possibly a hash+space and whatever follows
    /x and print "$1,$2,$3,$4,$5"' file
    
por 10.11.2016 / 16:36