我想过滤一个文本文件并仅有的打印每列都是有效浮点数的行。例如:
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