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