Substituindo sublinhado por vírgula e removendo aspas duplas no CSV

10

Eu tenho um arquivo CSV como

input.csv

"1_1_0_0_76"
"1_1_0_0_77"
"1_1_0_0_78"
"1_1_0_0_79"
"1_1_0_0_80"
"1_1_0_0_81"
"1_1_0_0_82"
"1_1_0_0_83"
"1_1_0_0_84"
"1_1_0_0_85"

............. e assim por diante.

Preciso converter esse arquivo CSV em

result.csv 

1,1,0,0,76
1,1,0,0,77
1,1,0,0,78
1,1,0,0,79
1,1,0,0,80
1,1,0,0,81
1,1,0,0,82
1,1,0,0,83
1,1,0,0,84
1,1,0,0,85
RKR
fonte

Respostas:

24

Maneira muito mais simples é usar tr

$ tr '_' ',' < input.csv | tr -d '"'                  
1,1,0,0,76
1,1,0,0,77
1,1,0,0,78

A maneira como isso funciona é que são trnecessários dois argumentos - conjunto de caracteres a serem substituídos e sua substituição. Nesse caso, temos apenas conjuntos de 1 caractere. Nós redirecionar input.csventrada trdo fluxo stdin via <operador de shell, e canalizar a saída resultante para tr -d '"'excluir aspas duplas.

Mas awkpode fazer isso também.

$ cat input.csv
"1_1_0_0_76"
"1_1_0_0_77"
"1_1_0_0_78"
$ awk '{gsub(/_/,",");gsub(/\"/,"")};1' input.csv
1,1,0,0,76
1,1,0,0,77
1,1,0,0,78

A maneira como isso funciona é um pouco diferente: o awk lê cada arquivo linha por linha, sendo cada script in-line /Pattern match/{ codeblock}/Another pattern/{code block for this pattern}. Como não temos um padrão, significa executar o bloqueio de código para cada linha. gsub()A função é usada para substituição global dentro de uma linha; portanto, a substituímos por sublinhados por vírgulas e aspas duplas por uma cadeia nula (excluindo efetivamente o caractere). O 1está no lugar da correspondência de padrão com o bloco de código ausente, o padrão é simplesmente imprimir a linha; em outras palavras, o código de bloqueio gsub()faz o trabalho e 1imprime o resultado.

Use o redirecionamento de shell ( >) para enviar a saída para um novo arquivo:

 awk '{gsub(/_/,",");gsub(/\"/,"")};1' input.csv > output.csv
Sergiy Kolodyazhnyy
fonte
Apologies.I também queria remover as aspas too.I atualizei a questão
RKR
@RKR Resposta atualizada em conformidade, a resposta de Ian também é atualizada #
Sergiy Kolodyazhnyy
13

Apenas como alternativa, você também pode usar este sedcomando:

$ sed -e 's/_/,/g' -e 's/"//g' input.csv
1,1,0,0,76
1,1,0,0,77
1,1,0,0,78
IanC
fonte
1
Nas aspas simples, você não precisa escapar de aspas duplas.
precisa saber é o seguinte
Na verdade, @glennjackman! I acabou de remover a barra invertida escapar
CNI
10

Perl, a "serra elétrica do exército suíço" do processamento de texto em linha de comando, também pode fazer isso. A sintaxe é (não por coincidência) bastante semelhante aos exemplos tre sed:

perl -pe 'tr/_"/,/d' input.csv > result.csv

ou:

perl -pe 's/_/,/g; s/"//g' input.csv > result.csv

Mas, honestamente, se você não quer gastar um tempo para aprender uma nova linguagem de programação (que é realmente o que awk, Perl e sed e outras ferramentas como elas são) apenas para esta tarefa básica, você pode fazê-lo da seguinte maneira: qualquer editor de texto que suporte pesquisa e substituição:

  1. Abra o arquivo CSV no seu editor de texto favorito (como gedit, kate, mousepad, etc .; até mesmo o Notepad ou Wordpad antigo no Windows podem fazer isso).

  2. Selecione "Pesquisar e substituir" no menu (normalmente encontrado em "Editar", se não houver um menu "Pesquisar" separado).

  3. Entre _na caixa de pesquisa e ,na caixa de substituição.

  4. Clique em "Substituir tudo".

  5. Repita com "na caixa de pesquisa e nada na caixa de substituição.

  6. Salve o arquivo.

Agora, se você precisar fazer isso para 100 ou 1000 arquivos, em vez de apenas um, aprender uma nova ferramenta de linha de comando começará a fazer sentido. E, é claro, uma vez que você saiba como usar Perl ou sed ou qualquer outra coisa, economizará muito tempo e esforço com tarefas semelhantes posteriormente. Mas, para apenas um trabalho pontual que você não espera fazer novamente, às vezes uma ferramenta interativa básica como um editor de texto é a solução mais simples.

Ilmari Karonen
fonte
3

Você também pode fazer isso vim.

Abra o arquivo:, vim input.csvdepois use vima ferramenta de pesquisa avançada s. Digite colon ( :) para entrar no modo de comando e execute comandos como este:

:%s's/_/,/g'  -- Replaces all occurrences of _ with , in the current file.
:s/\"//g -- Replaces all occurrences of " with nothing in the current file.

Praticamente os mesmos comandos da resposta do IanC, mas dentro de, em vimvez de usar sed.

Ponto de interrogação
fonte
2

Por que não apenas alterar os valores padrão dos valores do separador de entrada e saída

awk -F "_" 'BEGIN { OFS="," }; {gsub(/\"/,""); print $1,$2,$3,$4,$5}' input.csv
antuan sehikyan
fonte