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

标签 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

最佳答案

你不能用 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

关于linux - 删除 bash 中包含非数字条目的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35822141/

相关文章:

bash - 检查 DATE 是否为回文的 SED 命令

java - Jar 不在 linux 上执行

linux - 似乎无法使用 PSCP 将带有通配符的文件夹从 DOS 移动到 Linux?

postgresql - 什么是更改 PostgreSQL 配置的可靠方法,尤其是在脚本中移动其数据目录?

linux - 在 Bash 中将数字添加到可变大小

bash - Bash的Vi命令行编辑中区分command-mode和insert-mode的方法

awk sed 根据上一行替换行上的空格

c - 如何获取 C 语言中的本地 shell 变量?

c++ - 线程循环 system() 和 cout 破坏堆栈

linux - 用多个尾随模式替换行