我有一个如下所示的文件:
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