在选定的行上输出负值,无论原始符号如何

在选定的行上输出负值,无论原始符号如何

我使用以下代码读取 ASCII 文件“text.dat”中的特定行

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

输出是

Columnaxis: 100

为了仅输出上一行的第二部分,我在上一个命令行中添加了以下内容:

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

最后一个命令的输出是“100”

如何更新最后一个代码以输出负数,无论数字的原始符号如何? (即,如果输入是“+100”,我希望代码输出“-100”,如果输入是“-100”,我希望代码输出“-100”

附言。 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

相关内容