iterar linhas contendo zeros no bash

0

Eu estou tendo um arquivo que se parece com isso:

141.519
141.009
140.121
135.519
0
0
0
0

Estou escrevendo um script de shell e quero substituir todas as linhas que contêm um zero com -1e + 10.

Até agora, eu tentei isso:

while read a 
do
    if [ "$a" == "0" ]; then
        echo ${a//0/-1e+10}
        #let a="-1e+10"
    fi      
done < $name.pitch.f0.ascii  > $name.pitch.f0.ascii.replaced  ; 

mas, como resultado, todas as linhas são substituídas por -1e + 10. O que estou fazendo errado?

    
por paterpeng 28.11.2014 / 11:35

2 respostas

3

Seu código está faltando em else echo "$a" . Você não precisa usar um loop: Use sed , que processa o arquivo linha por linha:

sed -i~ -e 's/^0$/-1e+10/' $name.putch.f0.ascii

-i~ cria um backup com a extensão ~ .

s/// significa "substituto". ^ corresponde a um início de linha, $ corresponde a um final de linha.

    
por 28.11.2014 / 11:38
1

usando o awk:

awk '{if($0==0){print "-1e+10"}else{print $0}}' file

saída:

141.519
141.009
140.121
135.519
-1e+10
-1e+10
-1e+10
-1e+10

No código acima, se a linha contiver apenas 0 , ela será substituída por -1e + 10, caso contrário, imprima a linha como original

simplesmente: sugerido por muru

awk '$0 == 0 {$0 = "-1e+10"}1' file
    
por 28.11.2014 / 11:54

Tags