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