Manipulação de arquivos; Inserir um ";" a cada 12, 44 e 60 caracteres em cada linha de um arquivo de texto

1

Eu tenho que fazer um arquivo csv a partir de um arquivo de texto que contém dados sem delimitadores.

Parece:

2015021DUMMY001EAN1377689456777678945GERDE0002345
2015031DUMMY002EAN1345647876867867867TURTR0154565
......

Existe uma maneira fácil de inserir um ponto e vírgula em cada caractere x, yez em todas as linhas, preferencialmente usando bash ou sed?

    
por beislhur 31.12.2015 / 20:39

2 respostas

3

Você pode usar grupos de 12, 32 e 16 caracteres (12 + 32 = 44, 44 + 16 = 60):

sed 's/\(.\{12\}\)\(.\{32\}\)\(.\{16\}\)/;;/'

Sua entrada de amostra não contém 60 caracteres (49, se eu tiver a minha contagem correta). Caso contrário, usando apenas 12 e 32:

$ sed 's/\(.\{12\}\)\(.\{32\}\)/;;/' input
2015021DUMMY;001EAN1377689456777678945GERDE00;02345
2015031DUMMY;002EAN1345647876867867867TURTR01;54565

... que pode ou não ser o que você queria.

Em geral, os grupos teriam x, y-x e z-y-x caracteres de comprimento.

Ou você pode usar três substituições separadas:

sed 's/.\{12\}/&;/; s/.\{45\}/&;/; s/.\{62\}/&;/'

Neste caso, os comprimentos seriam x, y + 1 (para o ponto-e-vírgula inserido para x) e z + 2.

    
por 31.12.2015 / 20:50
2
sed 's/./&;/59; s//&;/43; s//&;/11' <in >out

Não tenho certeza se você deseja que ; seja o décimo segundo, quadragésimo quarto ou sexagésimo caractere em uma linha ou siga . Se este último, ou adicionar um a todos esses números e corre o risco de acrescentar um ponto e vírgula ao final da linha (se isso importa) ou veja abaixo. Como está escrito acima, no entanto, sed não irá anexar um sexagésimo caractere se já não houver um cinquenta e nove.

Para fazer inserções em vez de acrescentar:

sed 's/./;&/60; s//;&/44; s//;&/12' <in >out

... é outro caminho. Neste caso, sed nunca irá acrescentar um ponto e vírgula ao final da linha - ponto e vírgula são inseridos apenas na posição do sexagésimo caractere (por exemplo) se depois disso houver definitivamente um sexagésimo primeiro .

As três substituições não são mutuamente dependentes. De qualquer forma está escrito, sed adicionará um, dois ou três ponto e vírgula a uma linha, dependendo do seu tamanho. Qualquer linha com cinquenta e nove ou sessenta caracteres terá três linhas mais curtas que são pelo menos maiores que quarenta e dois ou quarenta e três caracteres obtêm dois pontos-e-vírgulas, e outras linhas correspondentes a pelo menos onze ou doze caracteres são editadas apenas uma vez. Linhas com menos de onze caracteres não são afetadas.

Se você quisesse afetar apenas as linhas que eram longas o suficiente para justificar os três pontos-e-vírgulas:

sed  -e's/./;&/60;ts'  -eb -e:s \
     -e's//;&/44;s//;&/12' <in >out

... isso funcionaria.

... com um% GNUsed (e minised ) você pode T est uma substituição para falha em vez de apenas para sucesso também:

sed -e's/./&;/59;T; s//&;/43; s/&;/12' <in >out
    
por 31.12.2015 / 20:58