Concatena vários arquivos com base na similaridade do nome do arquivo: Bash do Windows (usando o Windows 10), Powershell ou linha de comando)

1

Atualmente estou preso no que parece ser uma tarefa fácil. Eu tenho trabalhado em um script python que encontra certos arquivos na minha pasta Downloads e os despeja em outra subpasta dentro de uma pasta diferente. Em seguida, ele converte os PDFs dessa pasta designada em arquivos de texto, pois eu irei extrair informações dos arquivos (e é muito mais fácil trabalhar com o TXT).

Agora, estou preso nesta próxima parte: tenho ~ 600 arquivos (e continuarei a ter mais) e quero combinar arquivos com base no nome do arquivo. É assim que os nomes dos arquivos são formatados ...

  • Txt_BI_ProfilesBI_Profile_Export_BB + Generic_August + 2016_GGP_20170316.pdf
  • Txt_BI_BrofilesBI_Profile_Export_BB + Generic_August + 2016_GGP_20170316.pdf (1)
  • Txt_BI_ProfilesBI_Profile_Export_Search_20170228.pdf
  • Txt_BI_ProfilesBI_Profile_Export_Search_20170228.pdf (1)

Observe como existem arquivos que compartilham o nome do arquivo, mas são distinguíveis com .pdf (1). Preciso de um script powershell ou bash que agrupe e mescle arquivos em arquivos de texto consolidados com base na similaridade do nome do arquivo.

Então, considerando os nomes de arquivos acima, quero mesclar todo o conteúdo em

'TxtBI_ProfilesBI_Profile_Export_BB+Generic_August+2016_GGP_20170316.pdf' + 'Txt_BI_ProfilesBI_Profile_Export_BB+Generic_August+2016_GGP_20170316.pdf (1)' into a file = 'BB+Generic_August+2016_GGP'

e o mesmo vale para "Pesquisar". Para o grupo 'BB + Generic_August + 2016_GGP' e 'Search' existem até '.pdf (40)' ficheiros diferentes e existem cerca de 10 ou mais diferentes grupo de arquivos que compartilham nomes de arquivos semelhantes. Eu escrevi um script python que tenta fazer isso aqui mas tudo o que ele faz é dividir os nomes dos arquivos [33:] e filenames.rsplit (' ', 1) [0] (divide após o caractere 33 e o último' _ ') e não os combina em arquivos consolidados como mencionei acima. Posso fazer isso com powershell ou bash? Tal que divide os nomes dos arquivos (como acima mencionado) e, em seguida, combina-os se eles mantêm o mesmo nome de arquivo de texto?

Eu achei que isso seria super fácil, mas não está funcionando para mim. Se alguém tiver algum insight / idéias / sugestões sobre como abordar isso, eu realmente aprecio isso! Já usei bash no passado antes para unix, mas já faz um tempo. Eu vou com o que for mais prático! Ainda um pouco novato quando se trata de programar ....

    
por GGp 29.03.2017 / 17:07

1 resposta

1

Edit: melhor solução que produz os nomes dos arquivos de saída desejados

Fazendo uso de ls , awk e cat :

ls | awk '! /\([0-9]+\)/ {match($0, /Txt_BI_ProfilesBI_Profile_Export_([^.]+)/,matches); system("cat " $0 "* >"matches[1] ".txt")}'

Solicitado pela exibição de Matthew sobre os poderes de Powershell, eu tinha para mostrar que o mesmo pode ser alcançado em um ambiente festivo. Essa é apenas uma das muitas maneiras, como é comum no mundo do UNIX.

Explicação:

ls lista todos os elementos no diretório atual

awk linguagem de programação projetada para processamento de texto

! /\([0-9]+\)/ exclui nomes de arquivos que contêm um número entre parênteses

match($0, /Txt_BI_ProfilesBI_Profile_Export_([^.]+)/,matches) executa uma correspondência de expressão regular no nome do arquivo, capturando a parte entre o prefixo comum e o primeiro ponto

system(" executa um comando do sistema

cat " $0 "* concatenam arquivos que começam com o nome de arquivo

>"matches[1] ".txt" output para um arquivo chamado como a expressão capturada e com uma extensão .txt

Primeira resposta: Você pode usar find , xargs , bash e cat :

find . -type f -regextype sed ! -regex "\./.*([0-9]\+)" | xargs -I{} bash -c 'cat {}* > {}.txt'

Esta é mais uma prova de conceito e pode ser refinada, já que os nomes dos arquivos de saída não são exatamente o que você procurava, mas devem ser suficientes para resolver seu problema imediatamente.

Explicação:

find . pesquisa o diretório atual

-type f procura por arquivos

-regextype sed usa o mecanismo de expressões regulares com sintaxe compatível com sed

! -regex "\./.*([0-9]\+)" exclui resultados que correspondem à expressão regular especificada, ou seja, aqueles que incluem um número entre parênteses no final

| xargs usa cada resultado para construir um comando

-I{} no comando a seguir, substitua {} por cada find result

bash -c passa a seguinte string como um comando para bash

'cat {}* > {}.txt' concatena os arquivos que começam com o nome do arquivo encontrado em um arquivo que possui um nome composto pelo resultado find e a extensão .txt

    
por 29.03.2017 / 17:59