Concatenando uma lista de arquivos usando o loop For

0

Eu sou novo em unix / bash / code em geral, e estou tentando mesclar vários arquivos de amostra com o mesmo nome em diretórios diferentes em um novo arquivo em seu próprio diretório (as saídas de várias coletas de dados).

Para fazer isso, estou tentando criar um script que usa duas matrizes - listA, o nome de cada arquivo de amostra e a lista B, os nomes dos arquivos de amostra recém mesclados.

O meu código parece um pouco com isto:

#!/bin/sh

listA=( old1 old2 old3 etc.)
listB=( new1 new2 new3 etc.)

i=0

for i in $listA $listB

do

cp ./folder1/$listA ./merged/$listB
cat ./folder2/$listA >> ./merged/$listB
cat ./folder3/$listA >> ./merged/$listB
cat ./folder4/$listA >> ./merged/$listB

((i=+1))

done
echo "Done stitching"

Como é, parece fundir os arquivos para a primeira entrada na lista A no primeiro arquivo da lista B perfeitamente, mas não repetirá o processo para as entradas subseqüentes na lista.

Algum conselho para fazer este trabalho como pretendido? Desculpas por minha ignorância, sou muito novo em tudo isso e aproveito imensamente o processo de aprendizado - apenas um pouco perplexo.

    
por bellicosemagpie 27.02.2018 / 09:29

1 resposta

0

Resposta curta

while IFS=$'\t' read -r old new; do cat folder*/"$old" > merged/"$new"; done <list.tsv

Isso pressupõe que list.tsv contenha uma lista delimitada por tabulações de arquivos de origem (antigos) e de destino (novos).

Explicação

  • while IFS=$'\t' read -r old new; FOO; done <list.tsv : esta é uma construção de shell comum para ler cada linha de list.tsv e, em seguida, FOO em cada linha. Nesse caso, o separador do arquivo de entrada IFS é uma guia $'\t' , ou seja, o primeiro campo da linha é salvo em $old e o segundo campo (após a guia) é salvo em $new .
  • cat folder*/"$old" > merged/"$new" : concatene os arquivos em folder*/"$old" e grave isso em merged/"$new" . Isso pressupõe que os arquivos de origem estejam todos em folder* , por exemplo, chamado folder1 , folder2 , etc.
  • Como acontece com qualquer script, eu certamente testaria isso antes de executá-lo. Você pode fazer isso copiando um subconjunto de seus arquivos para outro diretório e, em seguida, usando uma versão curta de sua lista de entrada list.tsv . Verifique os resultados e, se estiver bem, execute-o para valer (mas mantenha um backup!).

Notas sobre sua solução sugerida

Eu apenas pensei em escrever alguns comentários sobre sua solução proposta, a fim de esclarecer como os vários comandos funcionam. Espero que isso seja útil para sua compreensão!

  • %código%. Isso cria uma matriz. A maneira de acessar partes dela é mostrada aqui . Usar listA=( old1 old2 old3 etc.) apenas acessará a primeira entrada, como você observou (de certa forma).
  • %código%. Isso itera sobre for i in $listA… , for i in a b c e a , colocando cada um em b . Por exemplo, tente executar c . N.B. Não faz sentido se referir a $i dentro do bloco for i in a b c; do echo $i; done . Da mesma forma, $listA e do…done são inconsistentes com i=0 de uso.
  • %código%. ((i=+1)) é desnecessário. for é a pasta atual, por isso não faz nada aqui.
  • %código%. ./folder1/$listA se concatenará sozinho (daí o nome). Não há necessidade de escrever instruções ./ separadas que anexam . a um arquivo. Você pode apenas listar vários arquivos depois de cat FOO >> , por exemplo cat .
por 28.02.2018 / 10:15