元の符号に関係なく、選択した行に負の値を出力します。

元の符号に関係なく、選択した行に負の値を出力します。

ASCIIファイル "text.dat"の特定の行を読み取るには、次のコードを使用しています。

sed -n '/Columnaxis/p' text.dat

出力は次のとおりです

Columnaxis: 100

前の行の2番目の部分だけを出力するために、前のコマンドラインに以下を追加しました。

 sed -n '/Columnaxis/p' text.dat | awk '{ print $2 }'

最後のコマンドの出力は「100」です。

数値の元の符号に関係なく、負の数を出力するように最後のコードをどのように更新できますか? (つまり、入力が「+100」の場合はコードで「-100」を出力したい、入力が「-100」の場合はコードで「-100」を出力したいと思います。

PS。 text.datの内容は次のとおりです。

Columnaxis: 100
Columnaxis_1: 100
Columnaxis_2: -100
Columnaxis_3: 50
Columnaxis_4: -2.3
Columnaxis_5: 1.2
Columnaxis_6: -5
Columnaxis_7: -2
Columnaxis_8: -4
Columnaxis_9: -2

コードから次のように出力したいと思います。

Columnaxis: -100

入力に「Columnaxis:+100」があるとします。

Columnaxis: -100

答え1

またはawk一人で:

$ cat text.dat
Columnaxis: 100
Columnaxis: +100
Columnaxis: -100

$ awk '/Columnaxis/ { gsub("-|+", "", $2); print "-"$2 }' text.dat
-100
-100
-100

答え2

これを行うには、文字列演算の代わりに算術演算を使用できます。

awk '
    function neg(x) {if (x<0) return x; else return -x}
    /Columnaxis/ {print neg($2)}
' file

「100」、「+100」、「-100」などの値に適用されます。

答え3

sed次のコマンドのみを使用してこれを実行できます。

sed -nE 's/^Columnaxis:[[:blank:]]+-?([0-9]+)$/-\1/p' file.txt

例:

$ cat file.txt
Columnaxis: 100
Columnaxis: -100
asdklasjds

$ sed -nE 's/^Columnaxis:[[:blank:]]+-?([0-9]+)$/-\1/p' file.txt
-100
-100

答え4

sed を使用して正規表現に置き換えることができます: sed -E 's/[+-]?([0-9]+)$/-\1/g'

cat text.dat 
Columnaxis: 100
Columnaxis: +100
Columnaxis: -100

sed -E 's/[+-]?([0-9]+)$/-\1/g' text.dat 
Columnaxis: -100
Columnaxis: -100
Columnaxis: -100

関連情報