
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
- 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
s
comando 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