迭代 bash 中包含零的行

迭代 bash 中包含零的行

我有一个如下所示的文件:

141.519
141.009
140.121
135.519
0
0
0
0

我正在编写一个 shell 脚本,我想用 -1e+10 替换所有包含零的行。

到目前为止,我已经尝试过:

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  ; 

但结果是,所有行都被替换为 -1e+10。我究竟做错了什么?

答案1

您的代码丢失了else echo "$a"。不过,您不必使用循环:使用sed它逐行处理文件:

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

-i~使用扩展名创建备份~

s///意思是“替代”。^匹配行开头,$匹配行结尾。

答案2

使用 awk:

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

输出:

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

在上面的代码中,如果行仅包含0它将替换为 -1e+10,否则将行打印为原始行

简单地说:穆鲁建议

awk '$0 == 0 {$0 = "-1e+10"}1' file

相关内容