Como posso usar o editor vim para formatar o texto dessa maneira?

1

Eu tenho um arquivo data.txt, o formato dos dados é algo como isto:

a|Êó•
a|Êõ∞
a|Ôõ∏
a|Ôùã
aa|Êòå
aa|Êòç
aaa|Êô∂
aamh|Êöò

tudo o que eu gostaria de fazer é converter o seguinte texto neste resultado:

'a' => ['Êó•','Êõ∞','Ôõ∏','Ôùã'],
'aa' => ['Êòå','Êòç'],
'aaa' => ['Êô∂'],
'aamh' => ['Êöò']

alguma idéia sobre isso? Obrigado.

user28167
fonte
O vim não é a ferramenta certa para isso. Você precisa usar awk, ou um scrip shell, (ou Perl, Ruby ..) (assumindo linux)
Nifle

Respostas:

4

Uma solução perl

#!/usr/bin/perl

use strict;
use warnings;

my $key = 'a';
my @data = ();

while(<>) {  
    chomp($_);
    my $line = $_;

    my ($k, $d) = split(/\|/, $line);

    if($k eq $key) {
        push(@data, $d);
    } else {
        my $text = join ',', map { qq/'$_'/ } @data;
        print "'$key' => [$text],\n";
        @data = ();
        push(@data, $d);
        $key = $k
    }
}
# this prints out any data still left
my $text = join ',', map { qq/'$_'/ } @data;
print "'$key' => [$text],\n"; 
Nifle
fonte
0

O viml pode ser a ferramenta certa para o trabalho: às vezes (por exemplo, Ms Windows) é mais fácil instalar o vim do que uma caixa completa perl / * nix.

" Parse the lines
let dict = {}
let lines=getline(1,'$')
call filter(lines, 'v:val =~  ".*|.*"')
for l in lines
  let [k,v] = split(l, '|')
  if has_key(dict, k)
    let dict[k] += [v]
  else
    let dict[k] = [v]
  endif
endfor
" produce the new lines ...
" ...in a new buffer
vnew
let res = []
for [k,ll] in items(dict)
  let l = string(k) . ' => ' . string(ll)
  let res += [l]
endfor
let sres=join(res,",\n")
put=sres
Luc Hermitte
fonte