![仅打印完全数字的行](https://linux22.com/image/26574/%E4%BB%85%E6%89%93%E5%8D%B0%E5%AE%8C%E5%85%A8%E6%95%B0%E5%AD%97%E7%9A%84%E8%A1%8C.png)
我想过滤一个文本文件并仅有的打印每列都是有效浮点数的行。例如:
3 6 2 -4.2 21.2
3 x 4.2 21.2
3 2 2.2.2
只有第一行会作为 传递x
,也不2.2.2
是有效的浮点数。我可以编写一个 python 脚本,简单地在每个部分上.splits()
运行一个try/except
块,但这对于较大的文件来说很慢。输入文件具有未知的可变长度列数,并且不会使用科学记数法。有awk
解决办法吗?
答案1
awk '
# skip any obvious stuff
/[^0-9. -]/ {next}
{
# test each field for a number
for (i=1; i<=NF; i++)
if ($i + 0 != $i)
next
print
}
'
这将破坏科学记数法中的有效数字:1.2e1 == 12
答案2
根据您所说的条件,正则表达式可能是一种可能性。我能够让以下 GNU awk 脚本在 RHEL 上运行。
awk '{for (i=1; i<=NF; ++i) {if ($i !~ /^[-]?[[:digit:]]+(\.[[:digit:]]+)?$/) break;if (i == NF)print($0)}}' file.txt
答案3
尝试这样的事情:
$ cat data.txt
3 6 2 -4.2 21.2
3 x 4.2 21.2
3 2 2.2.2
$ awk '/^\s*(-?[0-9]+(\.[0-9]*)?\s+)+\s*$/ { print }' < data.txt
3 6 2 -4.2 21.2