完全に数字の行のみを印刷

完全に数字の行のみを印刷

テキストファイルをフィルタリングしたい。ただ各列が有効な浮動小数点数である行を印刷します。たとえば、

3 6 2 -4.2 21.2 
3 x 4.2 21.2 
3 2 2.2.2

最初の行だけが有効な浮動小数点数xとして渡されます。単に2.2.2各セクションでチャンクを.splits()実行するPythonスクリプトを書くことができますが、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

上記の条件によっては、正規表現が可能な場合があります。 RHELで実行する次のGNU awkスクリプトを取得できます。

 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 

関連情報