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