Awk 如何将文件中以负数开头的值替换为零

Awk 如何将文件中以负数开头的值替换为零,awk,sed,Awk,Sed,我的文本文件如下。该文件包含一些负面数据。所以我想用零替换这些数据 1,2,3 4,5,-6 7,-8,9 我试过用下面的命令 sed 's/-*/0/g' 1.txt 但是我没有得到要求的输出。有谁能帮我一下吗。试试这个: sed 's/-[0-9]\+/0/g' 1.txt 其工作方式是,sed将查找与模式-[0-9]\+匹配的所有字符序列,并将其替换为0。现在,他们认为-[0-9]\+模式的含义如下:它将找到一个-字符,后跟一个非空字符序列(这是\+的含义),它完全由0和9之间的集合

我的文本文件如下。该文件包含一些负面数据。所以我想用零替换这些数据

1,2,3
4,5,-6
7,-8,9
我试过用下面的命令

sed 's/-*/0/g' 1.txt
但是我没有得到要求的输出。有谁能帮我一下吗。

试试这个:

sed 's/-[0-9]\+/0/g' 1.txt
其工作方式是,
sed
将查找与模式
-[0-9]\+
匹配的所有字符序列,并将其替换为
0
。现在,他们认为
-[0-9]\+
模式的含义如下:它将找到一个
-
字符,后跟一个非空字符序列(这是
\+
的含义),它完全由
0
9
之间的集合中的字符组成

sed 's/-[0-9]\+/0/g' 1.txt

其工作方式是,
sed
将查找与模式
-[0-9]\+
匹配的所有字符序列,并将其替换为
0
。现在,他们认为
-[0-9]\+
模式的含义如下:它将找到一个
-
字符,后跟一个非空的字符序列(这就是
\+
的含义)它完全由
0
9
之间的字符集组成。您必须更好地理解sed的正则表达式。
s/-*/0/g
中的表达式
-*
将匹配零个或多个'-'字符
*
在正则表达式中表示零个或多个重复字符,而不是通配符匹配,
所有字符集都匹配单个字符。看

对于你的问题,你必须建立一个匹配任何负数(也许你还需要考虑浮点数)。我建议:

-[0-9]*\.?[0-9]+
这是sed程序的扩展正则表达式,意思是以
-
开头,可以带或不带前置点号或点,并且必须至少包含一个数字

所以

这就是你需要的
-r
选项表示使用扩展正则表达式

一些测试:

echo '12, 0.12, -2' | sed -r s/-[0-9]*\.?[0-9]+/0/g
      12, 0.12, 0
echo '12, -234, -2' | sed -r s/-[0-9]*\.?[0-9]+/0/g
      12, 0, 0
echo '-0.98, 2.34, -2' | sed -r s/-[0-9]*\.?[0-9]+/0/g
          0, 2.34, 0
echo '-9.8, 0.34, -2' | sed -r s/-[0-9]*\.?[0-9]+/0/g
         0, 0.34, 0
echo '-9.8, 1.34, -2' | sed -r s/-[0-9]*\.?[0-9]+/0/g
         0, 1.34, 0
希望这将是有益的,检查导师


谢谢

您必须更好地理解sed的正则表达式。
s/-*/0/g
中的表达式
-*
将匹配零个或多个'-'字符
*
在正则表达式中表示零个或多个重复字符,而不是通配符匹配,
所有字符集都匹配单个字符。看

对于你的问题,你必须建立一个匹配任何负数(也许你还需要考虑浮点数)。我建议:

-[0-9]*\.?[0-9]+
这是sed程序的扩展正则表达式,意思是以
-
开头,可以带或不带前置点号或点,并且必须至少包含一个数字

所以

这就是你需要的
-r
选项表示使用扩展正则表达式

一些测试:

echo '12, 0.12, -2' | sed -r s/-[0-9]*\.?[0-9]+/0/g
      12, 0.12, 0
echo '12, -234, -2' | sed -r s/-[0-9]*\.?[0-9]+/0/g
      12, 0, 0
echo '-0.98, 2.34, -2' | sed -r s/-[0-9]*\.?[0-9]+/0/g
          0, 2.34, 0
echo '-9.8, 0.34, -2' | sed -r s/-[0-9]*\.?[0-9]+/0/g
         0, 0.34, 0
echo '-9.8, 1.34, -2' | sed -r s/-[0-9]*\.?[0-9]+/0/g
         0, 1.34, 0
希望这将是有益的,检查导师


谢谢

有了awk,你会写信的

awk -F, -v OFS=, '{for (i=1; i<=NF; i++) if ($i < 0) $i = 0; print}' file

有了awk,你就可以写作了

awk -F, -v OFS=, '{for (i=1; i<=NF; i++) if ($i < 0) $i = 0; print}' file
awk:

$awk'gsub(/-[0-9]+/,0)1'1.txt

与@redneb的sed解决方案相同,但采用awk。将记录$0中的所有
-
起始数字字符串(
[0-9]+
)替换为
0
),然后打印(
1

$awk'gsub(/-[0-9]+/,0)1'1.txt


与@redneb的sed解决方案相同,但采用awk。将所有
-
起始数字字符串(
[0-9]+
)替换为记录$0中的
0
,然后打印出来(
1
)。

*
表示匹配前一个字符零次或多次
*
表示匹配前一个字符零次或多次你是什么意思?它不是用0代替负数吗?如果没有,会发生什么?@sivakumarV你需要清楚地描述什么不起作用。。当我检查GNU sed时,这个解决方案运行得非常好。。只是猜测一下,您可能有不同的sed版本。。在提问时,建议添加这些信息,以防会产生影响。你的意思是什么?它不是用0代替负数吗?如果没有,会发生什么?@sivakumarV你需要清楚地描述什么不起作用。。当我检查GNU sed时,这个解决方案运行得非常好。。只是猜测一下,您可能有不同的sed版本。。在提问时,建议添加该信息,以防出现错误difference@rojeeer,请引用您的sed命令,例如:
sed-r的/-[0-9]*\?[0-9]+/0/g'1.txt>2.txt
@sp-asic-oh真的吗?我在Ubuntu终端上测试,不需要报价。在我看来,在运行命令时,参数将自动被视为字符串,您不需要引号,除非您的参数可能会破坏命令,例如,包含空格,此时,引号参数。谢谢。它从OP的3行输入的最后一行中切断了
,9
。。关于GNU sed 4.2。2@rojeeer,请引用您的sed命令,例如:
sed-r的/-[0-9]*\?[0-9]+/0/g'1.txt>2.txt
@sp-asic-oh真的吗?我在Ubuntu终端上测试,不需要报价。在我看来,在运行命令时,参数将自动被视为字符串,您不需要引号,除非您的参数可能会破坏命令,例如,包含空格,此时,引号参数。谢谢。它从OP的3行输入的最后一行中切断了
,9
。。关于GNU sed 4.2.2