Batch - Como agrupar vários arquivos juntos sem registros de cabeçalho

0

Estou tentando mesclar vários arquivos junto com o seguinte comando:

copy test1.txt+test2.txt test3.txt

Isso funciona muito bem, no entanto, os arquivos que estou tentando mesclar contêm registros de cabeçalho no início de cada um. Existe um comando que eu possa usar para excluir a primeira linha de um arquivo txt e apenas concatenar o resto?

EDIT: O objetivo final é combinar seis arquivos .txt contendo centenas de milhares de registros em um único arquivo.

    
por Intentional 28.04.2015 / 18:53

2 respostas

3

O seguinte funciona bem na linha de comando para a maioria das circunstâncias

(for %F in (test1.txt test2.txt) do @more +1 "%%F") >test3.txt

Duplique as porcentagens se você usar o comando em um script em lote.

O acima tem as seguintes limitações

  • Cada arquivo de origem deve ter menos de 64k linhas, caso contrário, ele será interrompido.
  • Quaisquer caracteres de tabulação serão convertidos em uma sequência de espaços
  • Eu acho que há pelo menos uma outra restrição, mas minha memória me falha (talvez bytes nulos convertidos para uma nova linha ??)


O script em lote a seguir não possui limitação além de cada linha deve ter menos de 8 k de comprimento. Mas provavelmente é muito lento para arquivos grandes (batch é uma péssima ferramenta para processamento de texto):
@echo off
setlocal disableDelayedExpansion
>test3.txt (
  for %%F in (test1.txt test2.txt) do for /f "skip=1 delims=" %%A in (
    'findstr /n "^" "%%F"'
  ) do (
    set "ln=%%A"
    setlocal enableDelayedExpansion
    echo(!ln:*:=!
    endlocal
  )
)


Você poderia escrever um script JScript ou VB personalizado que poderia fazer isso com eficiência.

Meu utilitário JScript / batch híbrido JREPL.BAT pode lidar com isso bem . É um exagero, mas vai eficientemente fazer o trabalho, mesmo com arquivos muito grandes.

O JREPL.BAT é um processador de texto de expressões regulares de propósito geral, com muitas opções. É um script puro que é executado nativamente em qualquer máquina Windows do XP em diante.

O seguinte irá funcionar na linha de comando.

>test3.txt (for %F in (test1.txt test2.txt) do @JREPL "^.*" "ln>1?$0:false" /jmatch /f "%F")

Se usado dentro de um script em lote, você deve usar CALL JREPL e dobrar as porcentagens:

@echo  off
>test3.txt (for %%F in (test1.txt test2.txt) do call JREPL "^.*" "ln>1?$0:false" /jmatch /f "%%F")
    
por 28.04.2015 / 19:27
1

Se todos os cabeçalhos forem uma linha, você poderá usar for file in test*.txt ; do cat $file | sed '1d;$d' ; done > output.file

Explicação:

for variable in pattern usou o bash em um loop for.
A maneira mais fácil de demonstrar isso é for a in * ; do echo $a; done , que listará todos os arquivos (e possivelmente a pasta) no diretório atual.

A saída é canalizada por sed (editor de fluxo) com o comando para excluir a primeira linha (suposição: Seus cabeçalhos são apenas uma linha longa).

> output_file deve ser óbvio.

Tenho certeza de que há métodos muito mais avançados. Por exemplo. usando find com -type f para obter apenas arquivos. Mas em uma pitada esta é uma solução muito simples usando apenas bash e sed e cat (e você explicitamente marcou isso como bash e pediu que as coisas fossem CONCATENADAS).

Edit: Como apontado, esta sintaxe é semelhante ao windows. Então a plataforma pode ser o windows.

Nesse caso, dê uma olhada em esta postagem no Stack Overflow e a resposta que contém FOR /F "tokens=* skip=1" %A IN ('type "input_file.ext"') DO @echo %A>>"output_file.ext"

A chave está em mais + 1

    
por 28.04.2015 / 19:01