mesclando arquivos de texto específicos em diretórios diferentes

3

Eu tenho 6 diretórios. Cada diretório inclui 8 arquivos de texto. Esses arquivos de texto compartilham o mesmo prefixo. Eu preciso combinar esses arquivos de texto da seguinte forma:

Suponha que o primeiro arquivo de texto em directory_1 contenha arquivos contendo o texto abc_1 , directory_2 contenha arquivos com o texto abc_2 e assim por diante. O arquivo de texto mesclado dos primeiros arquivos de texto precisa estar neste formato:

abc_1
abc_2
abc_3
..
abc_6

O segundo, terceiro ... e oitavo arquivos de texto também precisam ser combinados com a mesma regra.

    
por deepblue_86 30.11.2016 / 09:19

2 respostas

2

Seus arquivos devem ser classificáveis, portanto, supondo que os nomes dos arquivos em cada diretório terminem com um número de 1 a 8, como foo1 , foo2 ... em um diretório e bar1 , bar2 ... em outro e assim por diante, você poderia usar cat e for loop para con cat enatá-los:

for j in {1..8}; do cat directory_{1..6}/*$j > newfile$j; done

(não é necessário "citar" uma variável que sabemos ser um único dígito) Isso imprimirá, por exemplo, newfile1 , o conteúdo de

directory_1/foo1
directory_2/bar1
directory_3/baz1
...

qualquer que seja o conteúdo, e em newfile2 o conteúdo de directory_1/foo2 , diectory_2/bar2 etc

    
por Zanna 30.11.2016 / 11:04
3

Um método implícito (pode falhar se arquivos não relacionados com nome de arquivo terminado em _ e um número estiverem no mesmo diretório) que nomeia cada arquivo mesclado de acordo com o número do arquivo:

DIRS_BASE=directory_
for ((FNUM=1; FNUM<9; FNUM++)); do
    cat ${DIRS_BASE}[1-6]/*_${FNUM} > merged_${FNUM}
done

Um método explícito (mais seguro) usando uma lista de prefixos, que nomeia cada arquivo mesclado de acordo com o número do arquivo:

DIRS_BASE=directory_
PLIST=(abc def ghi jkl mno pqr)
NDIRS=${#PLIST[@]}
for ((FNUM=1; FNUM<9; FNUM++)); do
    PLIST_NUM=(${PLIST[@]/%/_$FNUM})
    cat ${PLIST_NUM[@]/#/$DIRS_BASE[1-$NDIRS]/} > merged_${FNUM}
done
    
por michael 30.11.2016 / 14:30