删除第一列不是数字的行

时间:2013-08-03 04:07:49

标签: unix csv awk

我有一个大型数据集,它是一个CSV文件,我已经清理了很多。但是,有些情况下我的列不是数字,我想删除这些行。

到目前为止,我认为这样的事情会起作用。我认为解决方案可能很简单。我不确定我是否能做到这样的事情。这是一个CSV文件,所以我试着告诉awk它用逗号分隔。第一列中的良好值的一个例子是:323870133825187840

awk '/,/$1 != numeric'

对此有任何建议吗?我最初想过做某种单线,比如,[0-9]等等。如果有人能帮助我,我会非常感激。对于那里的人来说,这可能就像孩子的游戏一样:)

3 个答案:

答案 0 :(得分:5)

假设您只处理无符号整数值,可以使用:

awk -F, '$1 ~ /^[[:digit:]]+$/'

awk -F, '$1 !~ /[^[:digit:]]/'

两者都使用'隐式打印'动作。第一次检查$1仅包含数字;第二次检查$1不包含非数字。

如果您的数字更一般(有符号,可能带有小数点,可能带有指数表示法 - 例如6.0221413e + 23(Avogadro的数字)),那么您需要一个更复杂的正则表达式并且将使用正匹配,仅选择字段1与正则表达式匹配的行,以获得有效数字。

答案 1 :(得分:1)

你可以简单地说:

grep -P '^[+-]?\d*(\.\d+)?(?<=.),' file

如果在第一列中找到带有可选=/-符号的十进制/整数,则返回行。

以下数据将在第1列中匹配:

6.72
1235.3
72
.66
2.8
+3.5
-5.9

PS:第1列中的空列值不匹配。

答案 2 :(得分:1)

试试这个:

awk -F, '$1+0 != $1{next}1' csvFile