【问题标题】:Removing a line where the first column is not numeric删除第一列不是数字的行
【发布时间】:2023-03-02 22:09:01
【问题描述】:

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

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

awk '/,/$1 != numeric'

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

【问题讨论】:

    标签: unix csv awk


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 第一个选项就像一个魅力。非常感谢。现在我的 CSV 文件中的所有数据都井井有条,我编写的 java 代码运行良好!谢谢你,我真的很感激。
    • 还有什么好的教程或网页可以让您或其他人推荐如何学习 awk 或 sed?每次我想使用 unix 命令做某事时,我都不想来董事会。
    • 曾经有一本 O'Reilly 关于 Awk 和 Sed 的书;快速搜索显示您仍然可以购买它们 (search.oreilly.com/?q=sed+awk)。我从7th Edition UNIX™ Programmer's Manuals (Vols 1 & 2) 中学到了,但是现代版本的命令比 1978 版本更强大。 GNU 手册(gawksed)也不错。
    • 非常感谢。我可能会调查一下。
    【解决方案2】:

    你可以简单地grep它:

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

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

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

    6.72
    1235.3
    72
    .66
    2.8
    +3.5
    -5.9
    

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

    【讨论】:

      【解决方案3】:

      试试这个:

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

      【讨论】:

      • 请添加一个简短的文章来解释您的代码。只粘贴代码是不可接受的。
      • 没什么好解释的。该代码只是执行 OP 所要求的:“我有一个不是数字的列,我想删除这些行。”
      猜你喜欢
      • 2020-09-17
      • 2013-06-05
      • 1970-01-01
      • 2020-04-20
      • 2021-08-13
      • 2014-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多