Dando um caminho comum para um grupo de arquivos em um script bash

2

O propósito do seguinte script é mesclar várias tabelas e colocá-las em um diretório específico usando o comando paste .

for i in {1..30}
 do
 paste ./directory"$i"/table1.txt table2.txt ... table20.txt > ./merged_tables/tables_directory"$i".txt
done 

Estou recebendo este erro:

 paste: file table2: No such file or directory

Ao escrever o caminho para cada tabela, isso funcionaria, mas eu não quero escrever o caminho muitas vezes, então existe alguma outra maneira de fazer isso sem escrever o caminho para cada tabela? Agradecemos antecipadamente

    
por Fersal 24.06.2018 / 14:55

3 respostas

3

for (( i = 1; i <= 30; ++i )); do
    ( cd "directory$i" &&
      paste tableNC023.txt tableNC088.txt tableNC102.txt ... ) >"./merged_tables/tables_directory$i.txt"
done

Isso usa cd para entrar no diretório em um subshell. Se o cd for bem-sucedido, paste será usado para criar os dados combinados. A saída da subshell é redirecionada para o seu arquivo de resultados como antes.

Como o cd é feito em um subshell, não é necessário cd .. , cd - ou cd "$OLDPWD" para "voltar atrás" para a próxima iteração.

Alternativa, para códigos mais simples:

tables=( tableNC023.txt tableNC088.txt tableNC102.txt
         more tables here )

for (( i = 1; i <= 30; ++i )); do
    ( cd "directory$i" &&
      paste "${tables[@]}" ) >"./merged_tables/tables_directory$i.txt"
done

Meu uso de for (( i ... )) em vez de for i in {...} é puramente baseado na preferência pessoal.

    
por 24.06.2018 / 15:02
0
for i in {1..30}
 do
 pushd directory"$i" >/dev/null 2>&1 || continue
 paste table1.txt table2.txt ... table20.txt > ../merged_tables/tables_directory"$i".txt
 popd >/dev/null 2>&1
done
    
por 24.06.2018 / 15:01
0

Como você já está usando a expansão de chaves, também é possível usá-lo aqui.

Ou a expansão gera a sequência de números ( .. é literal):

for i in {1..30}; do
    paste ./directory"$i"/table{1..20}.txt > ./merged_tables/tables_directory"$i".txt
done 

Ou liste-os manualmente (preencha o ... ):

for i in {1..30}; do
    paste ./directory"$i"/table{1,2,...,20}.txt > ./merged_tables/tables_directory"$i".txt
done 

Ou seja, supondo que você não queira apenas todos os arquivos no diretório que correspondem ao padrão:

for i in {1..30}; do
    paste ./directory"$i"/table*.txt > ./merged_tables/tables_directory"$i".txt
done 
    
por 24.06.2018 / 21:03

Tags