Eu tenho um diretório de e-books com o seguinte formato:
<authorname> <authorsurname> - <bookname>
Quero separar os livros por autores. Eu uso o comando abaixo em um loop for para esta operação:
for author in $(ls /home/me/books | awk -F "-" '{print $1}' | sort | uniq)
do
make a directory and push all books of this author to this directory
done
Espero ver o valor do sobrenome do autor ao lado do valor do nome do autor , mas esses valores são impressos linha por linha. Se eu executar o comando ls que no loop for como individual desta vez ele roda como eu quero (saída 1). Mas em um loop, não (saída 2).
Saída visual:
O que eu quero:
Edgar Allan Poe
Marcus Aurelius
O que acontece:
Edgar
Allan
Poe
Marcus
Aurelius
Como posso corrigir esse problema e classificar os autores como nome e sobrenome na mesma linha?
Editar: tentei "cat" um arquivo que contém nomes de autor. Mas também não funcionou.
O valor expandido de
$(command)
é uma única string plana contendo todas as linhas da saída do comando. Não é uma matriz de vários elementos de linhas individuais.Todas as expansões de shell sem aspas, sejam
$variables
ou$(commands)
, estão sujeitas à divisão de palavras. Como o nome indica, por padrão, o valor é dividido em palavras individuais – não linhas – com base nos separadores encontrados em $IFS.Para percorrer cada linha, use
mapfile
para importar a entrada para uma variável de array realdeclare -p authors
(com cada linha como um elemento de array separado, como pode ser visto mais adiante)......ou substitua
for
por um pipeline e um loop 'read'......ou pule tudo e use apenas a expansão curinga: