Como posso remover linhas semelhantes de um arquivo de texto (listagem de imagens) usando batch, JScript (JREPL?) ou vBScript?

1

O ambiente é WindowsXP (possivelmente atualizando para o Windows7 em breve).
Tenho permissão para executar scripts, mas NÃO posso instalar ferramentas.

O lote puro geralmente falha devido a problemas de desempenho ou caracteres "especiais" (como o ponto de exclamação).

FINDSTR geralmente falhou porque encontra TODAS as instâncias de uma string de pesquisa, em vez de apenas a primeira correspondência.

As soluções mais próximas que encontrei são aquelas mencionadas por dbenham em: link

Meu arquivo de texto normalmente contém uma lista (2MB) de imagens (a versão mais recente primeiro) por pasta (numero-alfabeticamente), geralmente criada por meio da linha de comando: dir * .jpg / o: -d / b / s > test.txt

Eu só quero manter as linhas mostrando a versão mais recente de cada imagem (marcada com asteriscos abaixo).

Essencialmente, eu só quero manter a primeira linha para cada id de imagem (os oito caracteres antes de #).

A ordem das imagens listadas NÃO deve mudar, porque a lista é usada para executar uma apresentação de slides:

D:16 London16-01-02 DSCN2111#227 bridge top.jpg   *
D:16 London16-01-02 DSCN2111#211 bridge top.jpg
D:16 London16-01-02 DSCN2111#110 bridge top.jpg
D:16 Paris16-01-01 imag1233#121 restaurant.jpg    *
D:16 Paris16-01-01 imag1233#110 restaurant.jpg
D:16 Paris16-01-01 P0001232#110 procession¿.jpg   *
D:16 Paris16-01-01 DSC_1231#111 skyline^05am.jpg  *
D:16 Paris16-01-01 DSC_1231#110 skyline^05am.jpg
D:16 Paris16-01-01 DSCN1230#310 fountain {!}.jpg  *
D:16 Paris16-01-01 DSCN1230#224 fountain {!}.jpg
D:16 Paris16-01-01 DSCN1230#110 fountain {!}.jpg
    
por TuesusMalnex 14.03.2016 / 13:48

1 resposta

2

Estou lhe dizendo que a lista já está classificada de tal forma que os arquivos nomeados já são contíguos e o mais recente é sempre listado primeiro.

Não deve ser difícil escrever um script VBS ou JScript dedicado, mas talvez seja um pouco mais fácil usar o JREPL com um pouco de JScript fornecido pelo usuário da seguinte forma:

jrepl "^(.+?)#.*$" "if ($1==prev) {false} else {prev=$1;$0}" /jmatch /jbeg "prev=''" /f test.txt
    
por 14.03.2016 / 17:37