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