Como dividir uma coluna para várias colunas no arquivo CSV

0

Eu tenho abaixo o texto no arquivo csv e preciso colocar FILE e TIMESTAMP em colunas separadas em um arquivo csv. Você poderia, por favor, me avisar como eu posso conseguir isso?

FILE, TIMESTAMP
/u01/app/xxcus/12.0.0/mds/cvs/oracle/apps/xxcus/receipt/server/XxReceipt.java, Thu 28 Jun 2018 02:49:45 AM EDT
/u01/app/xxcus/12.0.0/mds/cvs/oracle/apps/xxcus/receipt/webui/XxReceiptCreateCO.java, Thu 28 Jun 2018 09:00:43 AM EDT
/u01/app/xxcus/12.0.0/mds/cvs/oracle/apps/xxcus/receipt/webui/XxOlympusReceiptPG.xml, Thu 28 Jun 2018 05:16:46 AM EDT
/u01/app/xxcus/12.0.0/reports/US/XX_POXRCPPV.rdf, Thu 28 Jun 2018 12:31:29 PM EDT
/u01/app/xxcus/12.0.0/reports/US/XX_POXRCIPS.rdf, Thu 28 Jun 2018 12:31:40 PM EDT

Observação: tentei o comando de coluna, mas não está ajudando.

    
por Abraham Dev Prasad 05.07.2018 / 20:35

2 respostas

0

O sed caminho

Se você deseja substituir espaços de vírgula ( ,␣ ) por tabulações em seu arquivo, pode canalizar seu conteúdo por meio de sed. Aqui está um exemplo

$ echo '/apps/XxReceipt.java, Thu 28 Jun 2018 02:49:45 AM EDT' | sed 's:, :\t:g'
/apps/XxReceipt.java    Thu 28 Jun 2018 02:49:45 AM EDT

Explicação:

  • As aspas simples em torno de s:, :\t:g dizem ao shell para fornecer a string como está, como um único argumento, para sed.
  • Para sed, s na primeira posição significa substituição
  • : é o delimitador de padrão / substituição
  • ,␣ é o padrão para corresponder
  • \t é a substituição do padrão - uma sequência de escape para uma tabulação
  • g (global) diz ao sed para substituir cada correspondência da linha, não apenas a primeira.

Se você precisar corresponder padrões mais complexos com sed, poderá usar a opção -E , para que os padrões sejam interpretados como expressões regulares. Você pode encadear várias expressões sed se você prefixar cada uma com -e .

Se os dados csv estiverem em um arquivo, veja como canalizá-lo por meio do sed:

cat my-data.csv | sed 's:, :\t:g' | tee my-data.tsv

ou

cat my-data.csv | sed 's:, :\t:g' > my-data.tsv
    
por 07.07.2018 / 15:49
0

A maneira como estou lendo esta pergunta é que você gostaria de criar a saída formatada em CSV, com uma lista de arquivos. Para outra interpretação, veja o final desta resposta.

Aqui está um script de shell que fará isso. Ele usa a versão do Linux de stat para obter o timestamp da última modificação.

#!/bin/sh

echo "PATHNAME,TIMESTAMP"
stat -c '"%n",%y' "$@"

Após a saída de um cabeçalho, esse script simplesmente chama stat com os nomes de caminho mencionados na linha de comando para obter o registro de data e hora da última modificação (consulte o manual stat em seu sistema para descobrir como alterar isso). Imprime o nome do caminho (cotado) e o registro de data e hora.

Você usaria isso como

sh script.sh PATTERN >outputfile

Por exemplo:

$ sh script.sh *.log* *.tar >file.cvs

$ cat file.cvs
PATHNAME,TIMESTAMP
"dsmerror.log",2018-07-17 13:00:02.911711652 +0200
"dsminstr.log",2018-07-17 13:00:04.079726608 +0200
"dsminstr.log.bak",2018-05-13 18:00:03.231791181 +0200
"dsminstr.log.lock",2018-07-17 13:00:04.079726608 +0200
"archive_20170823-old.tar",2017-08-22 16:44:23.037803149 +0200
"archive_20170823.tar",2017-08-23 09:35:28.956158119 +0200
"archive_20180409.tar",2018-04-09 09:47:29.472374428 +0200
"archive-chr22.tar",2018-06-19 14:50:45.896447161 +0200
"gene_cache.tar",2018-04-25 09:44:15.518486626 +0200

Como o script é muito curto, seus comandos podem ser escritos diretamente na linha de comando. A linha de comando equivalente para o exemplo acima seria

$ { echo "PATHNAME.TIMESTAMP"; stat -c '"%n",%y' *.log* *.tar; } >file.cvs

Agora, quando tivermos este arquivo, poderemos formatá-lo bem para fins de geração de relatórios:

$ column -s, -t file.csv
PATHNAME                    TIMESTAMP
"dsmerror.log"              2018-07-17 13:00:02.911711652 +0200
"dsminstr.log"              2018-07-17 13:00:04.079726608 +0200
"dsminstr.log.bak"          2018-05-13 18:00:03.231791181 +0200
"dsminstr.log.lock"         2018-07-17 13:00:04.079726608 +0200
"archive_20170823-old.tar"  2017-08-22 16:44:23.037803149 +0200
"archive_20170823.tar"      2017-08-23 09:35:28.956158119 +0200
"archive_20180409.tar"      2018-04-09 09:47:29.472374428 +0200
"archive-chr22.tar"         2018-06-19 14:50:45.896447161 +0200
"gene_cache.tar"            2018-04-25 09:44:15.518486626 +0200

Isso funciona, a menos que qualquer um dos nomes de caminho contenha uma vírgula.

Para formatar corretamente isso com um analisador de CSV, que também lidaria com nomes de caminho contendo vírgulas:

$ csvlook file.csv
| PATHNAME                 | TIMESTAMP                           |
| ------------------------ | ----------------------------------- |
| dsmerror.log             | 2018-07-17 13:00:02.911711652 +0200 |
| dsminstr.log             | 2018-07-17 13:00:04.079726608 +0200 |
| dsminstr.log.bak         | 2018-05-13 18:00:03.231791181 +0200 |
| dsminstr.log.lock        | 2018-07-17 13:00:04.079726608 +0200 |
| archive_20170823-old.tar | 2017-08-22 16:44:23.037803149 +0200 |
| archive_20170823.tar     | 2017-08-23 09:35:28.956158119 +0200 |
| archive_20180409.tar     | 2018-04-09 09:47:29.472374428 +0200 |
| archive-chr22.tar        | 2018-06-19 14:50:45.896447161 +0200 |
| gene_cache.tar           | 2018-04-25 09:44:15.518486626 +0200 |

csvlook faz parte do csvkit , um kit de ferramentas Python para trabalhar com arquivos CSV.

    
por 17.07.2018 / 13:42

Tags