unindo cada linha do arquivo com sublinhado

0

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?

    
por user3138373 01.08.2018 / 21:06

5 respostas

5

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

    
por 01.08.2018 / 21:12
4

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
    
por 01.08.2018 / 21:09
2

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
    
por 01.08.2018 / 22:25
0

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.

    
por 01.08.2018 / 22:27
-1

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
    
por 01.08.2018 / 21:34

Tags