Bashで0を含む行を繰り返します。

Bashで0を含む行を繰り返します。

次のファイルがあります。

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

関連情報