次のファイルがあります。
141.519
141.009
140.121
135.519
0
0
0
0
私はシェルスクリプトを書いており、0を含むすべての行を-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
ファイルを 1 行ずつ処理するには、次のようにします。
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