3

我有一个大型数据集,它是一个 CSV 文件,并且我已经对其进行了相当多的清理。但是,在某些情况下,我有一列不是数字的,我想删除这些行。

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

awk '/,/$1 != numeric'

有没有这方面的建议。我最初考虑做某种单行,例如 [0-9] 等。如果有人能帮助我解决这个问题,我将不胜感激。对于外面的人来说,这可能就像儿戏:)

4

3 回答 3

5

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

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

或者

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

两者都使用“隐式打印”操作。第一个检查$1只包含数字;第二个检查$1不包含非数字。

如果您的数字更一般(例如,有符号,可能带有小数点,可能带有指数符号 - 6.0221413e+23(阿伏伽德罗数)),那么您需要一个更复杂的正则表达式并将使用正匹配,只选择符合以下条件的行字段 1 匹配您的正则表达式以获得有效数字。

于 2013-08-03T05:14:07.713 回答
1

你可以简单地 grep :

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

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

例如,以下数字将在第 1 列中匹配:

6.72
1235.3
72
.66
2.8
+3.5
-5.9

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

于 2013-08-03T05:32:37.477 回答
1

尝试这个:

awk -F, '$1+0 != $1{next}1' csvFile
于 2013-08-03T09:17:15.480 回答