Como inserir vírgula no local determinado?

0

Eu tenho um arquivo de texto com mais de 100 MB, cada linha com o mesmo número de colunas:

Column No.: 0 1 2 3 4 5 6
            d x c c s b c
            .............

Eu quero adicionar , em determinados locais. Por exemplo, location = 2, 3, 5

A saída desejada seria:

Column No.:  0 1 2  3  4 5  6
             d x c, c, s b, c
             .............

O arquivo de localização seria um arquivo texto ou csv

2
3
5

O arquivo de texto precisa ter delimitadores.

Atualização:

Dados de amostra

  • Nota: as quebras de linha são onde eu quero colocar delimitadores
  • O nº da coluna é o deslocamento de bytes desde o começo da linha
por John Hass 22.10.2016 / 02:15

2 respostas

2

Use Sed.

Note que você não usará 0 posições indexadas, mas a partir de 1. Então, eu incrementei os números que você deu.

Além disso, você tem que voltar para a frente desde que, depois de alterar o primeiro, as posições das colunas mudam. Então use Sed assim:

sed 's/./&,/6;s/./&,/4;s/./&,/3'

Exemplo:

$ echo dxccsbc
dxccsbc
$ echo dxccsbc | sed 's/./&,/6;s/./&,/4;s/./&,/3'
dxc,c,sb,c
$ 
  • O comando s em Sed é para substituição.
  • O padrão . corresponde a qualquer caractere único.
  • O & no texto de substituição significa "o texto que foi correspondido" e a vírgula é uma vírgula literal.
  • O sinalizador numérico após o último / significa executar apenas a substituição na "nth" correspondência na linha.

Se você quer ser realmente chique, use a expansão da chave Bash para criar os comandos Sed:

$ echo dxccsbc | sed '-es/./&,/'{6,4,3}
dxc,c,sb,c

Mas isso é apenas cereja no topo do bolo e, provavelmente, confuso, a menos que você entenda tanto Sed e Bash muito bem. :)

Se você quiser puxar a lista de posições de um arquivo separado (como você realmente mostra na sua pergunta), você pode fazer isso da seguinte forma:

sed -f <(sort -rn positionsfile | sed -n 's:^[1-9][0-9]*$:s/./\&,/&:p') file

Observe que isso é específico do Bash, pois usa a sintaxe de substituição do processo que não é POSIX. Note também que eu tornei isso bastante robusto, já que qualquer coisa, a não ser números no arquivo de posições (que não começam com 0), será descartado.

Resultados do teste:

$ cat file 
abcdefg
ABCDEFG
abcdelaksjdflkjsdflli
sdlfihsdlfkj
$ cat positionsfile 
2
15
5
7something
01
not a number
$ sed -f <(sort -rn positionsfile | sed -n 's:^[1-9][0-9]*$:s/./\&,/&:p') file
ab,cde,fg
AB,CDE,FG
ab,cde,laksjdflkj,sdflli
sd,lfi,hsdlfkj
$ 
    
por 22.10.2016 / 02:25
1

com perl :

#!/usr/bin/env perl

my @pos;

while (<>)
    { push @pos, 1 + int; }
continue
    { last if eof; }

@pos = sort { $b cmp $a } @pos;

while (<>) {
    for my $k (@pos)
        { s/^.{$k}\K/,/; }
    print;
}

Execute assim:

script.pl positions.txt file.txt
    
por 22.10.2016 / 06:37