我有一个包含条目
的示例数据文件(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
答案 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}}