![在选定的行上输出负值,无论原始符号如何](https://linux22.com/image/7355/%E5%9C%A8%E9%80%89%E5%AE%9A%E7%9A%84%E8%A1%8C%E4%B8%8A%E8%BE%93%E5%87%BA%E8%B4%9F%E5%80%BC%EF%BC%8C%E6%97%A0%E8%AE%BA%E5%8E%9F%E5%A7%8B%E7%AC%A6%E5%8F%B7%E5%A6%82%E4%BD%95.png)
我使用以下代码读取 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