Use tr para transliterar um espaço para um sublinhado:
while read line
do
echo ${line} | tr -s " " "_"
done < test.txt
Homo_sapiens Mus_musculus Rat_rattus_rattus
Eu tenho um arquivo de entrada chamado test.txt assim:
Homo sapiens
Mus musculus
Rat rattus rattus
Eu quero usar um loop for aqui e percorrer cada linha. Alguma coisa assim:
for i in "'cat test.txt'"
do
fn=store_name
do something else > ${fn}.txt
done
Como cada linha tem um espaço entre os nomes, usei aspas duplas em cat test.txt . Eu quero fazer uma variável fn que atribui _ entre esses nomes das linhas, então meu fn se torna Homo_sapiens e Mus_musculus e se eu tiver Rat rattus rates , ele se torna Rat_rattus_rattus
Como posso conseguir isso?
Use tr para transliterar um espaço para um sublinhado:
while read line
do
echo ${line} | tr -s " " "_"
done < test.txt
Homo_sapiens Mus_musculus Rat_rattus_rattus
Usando awk :
awk '{OFS="_";}{$1=$1; print}' test.txt
Usando um loop:
while read -r line; do
line=${line// /_}
command using "$line"
done<test.txt
Eu usaria sed e leria sua saída com um loop:
sed 's/[[:space:]]\+/_/g' test.txt | while IFS= read -r line; do
process "$line" however
done > some.output.file
Aqui está um loop rápido que usa sed para fazer isso:
for file in $(sed "s/ /_/g" test.txt); do echo "test" > $file; done
Apenas substitua o comando echo por qualquer coisa que você queira fazer.
Eu uso comandos como esse o tempo todo, embora o dia todo.
Alguém deu uma resposta com tr e outra pessoa deu uma com awk , eis como fazer isso com sed :
for i in "'cat test.txt'"
do
fn="$(echo "$i" |sed -e 's/ /_/g')"
'do something else' > $fn.txt
done