¿Cómo insertar una coma en una ubicación determinada?

¿Cómo insertar una coma en una ubicación determinada?

Tengo un archivo de texto de más de 100 MB, cada línea del cual tiene la misma cantidad de columnas:

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

Quiero agregar ,en ubicaciones determinadas. Por ejemplo,location = 2, 3, 5

El resultado deseado sería:

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

El archivo de ubicación sería untextoocsvarchivo

2
3
5

El archivo de texto debe tener delimitadores.

Actualizar:

Data de muestra

ingrese la descripción de la imagen aquí

  • Nota: los saltos de línea son donde quiero poner delimitadores
  • El número de columna es el byte desplazado desde el principio de la línea.

Respuesta1

Utilice Sed.

Tenga en cuenta que no utilizará 0 posiciones indexadas, sino que comenzará desde 1. Así que incrementé los números que proporcionó.

Además, tienes que volver al frente ya que una vez que cambias el primero, las posiciones de las columnas cambian. Entonces usa Sed así:

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

Ejemplo:

$ echo dxccsbc
dxccsbc
$ echo dxccsbc | sed 's/./&,/6;s/./&,/4;s/./&,/3'
dxc,c,sb,c
$ 

  • El scomando en Sed es para sustitución.
  • El patrón .coincide con cualquier carácter.
  • En &el texto de reemplazo significa "el texto que coincidió" y la coma es una coma literal.
  • La bandera numérica después del último /significa realizar la sustitución solo en el "ésimo" partido de la línea.

Si quieres seren realidadelegante, use la expansión de llaves Bash para crear los comandos Sed:

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

Pero eso es sólo la guinda del pastel y probablemente confuso a menos que entiendas bastante bien tanto a Sed como a Bash. :)


Si desea extraer la lista de posiciones de un archivo separado(como realmente muestra en su pregunta), puede hacer esto así:

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

Tenga en cuenta que esto es específico de Bash ya que utiliza una sintaxis de sustitución de procesos que no es POSIX. También tenga en cuenta que he hecho esto bastante robusto como cualquier cosa menos real.númerosen el archivo de posiciones (que no comienzan con 0) se descartarán.

Resultados de la prueba:

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

Respuesta2

Con 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;
}

Ejecútelo así:

script.pl positions.txt file.txt

información relacionada