Como inserir vírgula em determinado local?

Como inserir vírgula em determinado local?

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
            .............

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 umtextooucsvarquivo

2
3
5

O arquivo de texto deve ter delimitadores.

Atualizar:

Dados de amostra

insira a descrição da imagem aqui

  • Nota: as quebras de linha são onde quero colocar os delimitadores
  • O número da coluna é o deslocamento de bytes desde o início da linha

Responder1

Use Sed.

Observe que você não usará 0 posições indexadas, mas começando em 1. Portanto, aumentei os números que você forneceu.

Além disso, você tem que voltar para frente, pois 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 scomando no 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.
  • A bandeira numérica após a última /significa realizar a substituição apenas na “enésima” partida da linha.

Se você quiser serrealmentefantasia, use a expansão de chaves Bash para criar os comandos Sed:

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

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


Se você quiser extrair a lista de posições de um arquivo separado(como você realmente mostra na sua pergunta), você pode fazer assim:

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

Observe que isso é específico do Bash, pois usa uma sintaxe de substituição de processo que não é POSIX. Observe também que tornei isso bastante robusto como tudo menos realnúmerosno arquivo de posições (que não começa com 0) será descartado.

Resultado dos testes:

$ 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
$ 

Responder2

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

informação relacionada