我试图通过检查列是否为数字来使用awk清理我的tsv文件。我已经尝试了几个正则表达式匹配,但没有一个完全符合我的要求:
12
- >是
12.01
- >是的
12m13d
- >没有
strange
- >无
"strange"
- >无
strange7
- >无
我试过了:
head -1 file.tsv | awk -F"\t" '{
if($6 ~ /^\d+$/)
print;
else;
}'
false
返回5.6
;
我也尝试过:
head -1 file.tsv | awk -F"\t" '{
if(7a ~ /^-*[0-9,\.]+$/)
printf "yes"
else printf "no"
}'
但这会为“7a”返回true
(我希望它返回false
)
答案 0 :(得分:3)
在正则表达式中使用字符类:
^[\d.]+$
虽然这会传递你的所有例子,但如果你想更严格,请使用:
^\d+(\.\d+)?$
将句号数量限制为一个。
答案 1 :(得分:2)
答案 2 :(得分:1)
您是否考虑过对其进行算术运算以查看其是否与数字相似,例如:添加0然后比较以查看结果是否等于原始结果:
$ cat file
12 -> yes
12.01 -> yes
12m13d -> no
strange -> no
"strange" -> no
strange7 -> no
$ awk '{print $0 " => " ($1==$1+0 ? "yes" : "no")}' file
12 -> yes => yes
12.01 -> yes => yes
12m13d -> no => no
strange -> no => no
"strange" -> no => no
strange7 -> no => no