仅打印完全数字的行

仅打印完全数字的行

我想过滤一个文本文件并仅有的打印每列都是有效浮点数的行。例如:

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 

相关内容