Como posso criar uma matriz a partir da primeira linha de várias fontes de texto?

8

Eu tenho uma matriz de caminhos para arquivos, cada um com várias linhas de texto. Eu gostaria de produzir uma matriz que é preenchida com a primeira linha de cada arquivo processado da seguinte forma:

# this.txt first line is [Test this]
# another.txt first line is [Test another]
paths=(
  ./this/path/this.txt
  ./another/path/another.txt
)

for i in ${paths[@]}; do
  read -r line < $i
  lines+=$line
done

No máximo, obtive apenas um valor na minha matriz. Não consigo obter a matriz que estou procurando fora do loop for. Eu tentei muitas variações e tive dificuldade em descobrir onde estou errado.

dimmech
fonte

Respostas:

11

Você queria

lines+=("$line")

+=WORD é concatenação de sequência (ou adição). Uma atribuição composta +=(...) acrescenta os valores à matriz.

Você provavelmente também desejará citar todas as suas expansões variáveis ​​aqui - lineelas definitivamente serão necessárias se a linha contiver espaço em branco, mas também poderá haver problemas em outros lugares.

Michael Homer
fonte
Obrigado, agora faz sentido porque em algumas das minhas tentativas parecia que o resultado foi uma mistura das duas linhas.
dimmech
4

No Bash, você também pode ler linhas em uma matriz diretamente. Se você selecionar o comprimento atual da matriz ${#lines[@]}como o índice de inserção, poderá anexá-lo:

for i in "${paths[@]}"; do
    mapfile -t -n 1 -O ${#lines[@]} lines < "$i"
done

Trecho da sinopse

mapfile mapfile [-n count] [-O origin] [-t] [array]

Ler a partir de linhas de entrada para o padrão variável matriz indexada matriz [...]. As opções, se fornecidas, têm os seguintes significados:

  • -n: Copie na maioria das linhas de contagem . Se contagem for 0, todas as linhas serão copiadas.

  • -O: Comece a atribuir a matriz na origem do índice . O índice padrão é 0.

  • -t: Remova uma nova linha à direita de cada linha lida.

David Foerster
fonte