Como adicionar vírgula após cada coluna?

0

Eu preciso fazer isso, então quando eu abrir o .csv no excel, cada coluna tem sua própria aba.

Meu texto é assim:

smmsp              Purpose - Service account for Sendmail; Owner - sysadmin; SERVICE ACCOUNT                            n    Account expires : never
samba              Purpose - Service account for Samba; Owner - sysadmin; SERVICE ACCOUNT                               n    Account expires : never
puppet             Purpose - Service account for Puppet; Owner - sysadmin; SERVICE ACCOUNT                              n    Account expires : never

Eu preciso assim:

smmsp,              Purpose - Service account for Sendmail; Owner - sysadmin; SERVICE ACCOUNT,                            n,    Account expires : never,
samba,              Purpose - Service account for Samba; Owner - sysadmin; SERVICE ACCOUNT,                               n,    Account expires : never,
puppet,             Purpose - Service account for Puppet; Owner - sysadmin; SERVICE ACCOUNT,                              n,    Account expires : never,

Eu tentei canalizar o outpu para awk 'gsub(" ", ",", $1)' FS=, OFS=, , mas ele substitui cada espaço com uma vírgula

    
por Nick_baba 21.12.2016 / 15:48

3 respostas

1

O arquivo de entrada parece estar no formato de largura fixa. Você deve conseguir abrir isso no Excel e especificar a localização de cada coluna sem qualquer modificação.

No entanto, como parece que todos os campos do seu exemplo de entrada contêm pelo menos dois ou mais espaços de preenchimento, você pode substituir todas as ocorrências de dois ou mais espaços por uma vírgula:

sed -r 's/  \+/,/g' input.txt

Advertências:

  • O texto acima requer expressões regulares estendidas ( -r ), disponíveis no arquivo sed do GNU
  • Se qualquer um dos campos de texto for longo o suficiente para preencher o campo de largura fixa ou deixar apenas um espaço, não será possível inserir a vírgula.

Aqui está outra maneira que coloca as vírgulas no final dos campos de largura fixa e, em seguida, remove os espaços extras. A largura dos campos de largura fixa neste exemplo é baseada no seu exemplo de entrada:

sed 's/\(.\{19\}\)\(.\{101\}\)\(.\{5\}\)/,,,/' columns.txt | sed 's/ *,/,/g'

Este último método não requer expressões regulares estendidas e deve funcionar mesmo se uma entrada preencher todo o campo de largura fixa.

    
por 28.12.2016 / 15:25
0

Uma vez que você parece querer preservar o espaçamento interno eu faria algo semelhante à solução @ cherdt, mas você pode capturar os espaços como

sed -e 's/\(  \+\)/,/g' input

que colocará uma vírgula antes de cada bloco de 2 ou mais espaços sem alterar o número de espaços.

    
por 28.12.2016 / 16:11
0

Se as colunas forem separadas por guias (parece que funcionam), isso deve funcionar:

$awk -F "[\t]*" '{print $1", "$2", "$3", "$4", "}' b.txt
smmsp, Purpose - Service account for Sendmail; Owner - sysadmin; SERVICE ACCOUNT, n, Account expires : never, 

Se as colunas não forem separadas por tabulações, mas por espaços, o uso de espaço como separador será um pouco confuso, pois o espaço existe mesmo entre os dados.

Eu leio o arquivo e o armazeno em uma matriz como esta:

$while IFS=" " read -a line;do for i in {0,11,12,16};do line[$i]+=",";done;echo "${line[@]}";done <b.txt
smmsp, Purpose - Service account for Sendmail; Owner - sysadmin; SERVICE ACCOUNT, n, Account expires : never,
smmsp, Purpose - Service account for Sendmail; Owner - sysadmin; SERVICE ACCOUNT, n, Account expires : never,
smmsp, Purpose - Service account for Sendmail; Owner - sysadmin; SERVICE ACCOUNT, n, Account expires : never,
smmsp, Purpose - Service account for Sendmail; Owner - sysadmin; SERVICE ACCOUNT, n, Account expires : never,
smmsp, Purpose - Service account for Sendmail; Owner - sysadmin; SERVICE ACCOUNT, n, Account expires : never,

Eu notei que em termos de separação de espaço, eu preciso adicionar vírgula na linha de elementos da matriz [0], linha [11], linha [12] e linha [16].

Esses truques exigem que todas as linhas tenham o mesmo formato.
Caso contrário, você precisa ler cada elemento da matriz e inserir a vírgula onde quiser.

Se você tem muitas linhas e se preocupa com o desempenho, pode criar um script awk para processar todas as variáveis (de $ 1 até $ NF) de maneira semelhante, mas dentro de um script awk (não sou bom em awk ..)

    
por 28.12.2016 / 15:46