删除bash中包含非数字条目的行

时间:2016-03-06 01:49:32

标签: linux bash sed grep

我有一个包含条目

的示例数据文件(sample.log)
0.0262
0.0262
0.7634
5.7262
0.abc02

我需要过滤掉包含非数字数据的行,在上面的行中,最后一个条目。

我试过这个

sed 's/[^0-9]//g' sample.log

它删除了非数字行,但也删除了小数值,我得到的输出是

00262
00262
07634
57262

如何在消除非数字行后保留原始值。我可以使用tr还是awk

5 个答案:

答案 0 :(得分:4)

你无法使用sed或grep或任何其他不理解数字的工具来强有力地完成这项工作,你需要使用awk:

$ cat file
1e3
1f3
0.1.2.3
0.123

$ awk '$0==($0+0)' file
1e3
0.123

使用sed解决方案可以做的最好的事情是:

$ sed '/[^0-9.]/d; /\..*\./d' file
0.123

删除包含除数字或句点以外的所有行的所有行,然后删除包含2个或更多句点(例如IP地址)但仍无法将指数表示法识别为数字的所有行。

如果您有十六进制输入数据和GNU awk(请参阅@dawg's comment below):

$ echo "0x123" | awk --non-decimal-data '$0==($0+0){printf "%s => %f\n", $0, ($0+0)}'
0x123 => 291.000000

答案 1 :(得分:1)

在awk中:

awk '/^[[:digit:].]+$/{print $0}' file

或者,你否定了这一点(如果在你的字符串中,则添加潜在的+-):

awk '/[^[:digit:].+-]/{next} 1' file

或者与sed相同的逻辑:

sed  '/[^[:digit:].+-]/d' file
Ed Morton的solution非常强大。给出:

$ cat nums.txt
    1e6          
.1e6
1E6
.001
.
0.001
.1.2
1abc2
0.0
-0
-0.0
0x123
0223
011
NaN
inf
abc

$ awk '$0==($0+0) {printf "%s => %f\n", $0, ($0+0)}
       $0!=($0+0) {notf[$0]++;}
       END {for (e in notf) print "\""e"\""" not a float"}' /tmp/nums.txt
        1e6           => 1000000.000000
.1e6 => 100000.000000
1E6 => 1000000.000000
.001 => 0.001000
0.001 => 0.001000
0.0 => 0.000000
-0 => 0.000000
-0.0 => 0.000000
0x123 => 291.000000
0223 => 223.000000
011 => 11.000000
NaN => nan
inf => inf
".1.2" not a float
"1abc2" not a float
"abc" not a float
"." not a float

答案 2 :(得分:0)

使用:

flowlayoutpanel

答案 3 :(得分:0)

这可能适合你(GNU sed):

sed '/[^0-9.]/d' file

然而,这可能会对IP地址产生误报,即允许多个.

使用您的测试数据:

sed '/^[0-9]\.[0-9]\{4\}$/!d' file

只匹配一个数字,然后是.后跟4位数。

答案 4 :(得分:0)

如果丢弃任何包含任何字母的行,您可以使用grep轻松完成:

{{1}}