【问题标题】:Print lines that are not numbers打印不是数字的行
【发布时间】:2020-03-11 17:58:00
【问题描述】:

很简单,我有一个 csv 文件,其中一列应该只包含整数。但是,并非所有这些都是整数,我想检查这个文件(超过 5 GB 大)并捕获行号和(最好)不是整数的值。我尝试了很多方法,例如使用口罩,但都无济于事。

例如,我们有以下 csv 表:

ID
5342
76375
sdfg23
2342lslf
jfijfojwo
395-34425
abc-24523
afhfhue3224

我想知道第 3、4、5、6、7 和 8 行不是整数。输出看起来像(作为数据框/表等价物):

+-------------+------+
| ID          | Row  |
+-------------+------+
| sdfg23      | 3    |
| 2342lslf    | 4    |
| jfijfojwo   | 5    |
| 395-34425   | 6    |
| abc-24523   | 7    |
| afhfhue3224 | 8    |
+-------------+------+

或者甚至只是将行号溢出到标准输出会非常有帮助。

我尝试过使用sed 之类的方法,例如:sed -n '/?![[:digit:]]=' csvfile.csv

【问题讨论】:

  • 几行示例(例如 3-5 行)、预期输出以及您尝试过的至少一个命令将大大有助于使您的问题更清晰、更容易回答
  • 对不起!我修好了,现在应该更清楚了@Sundeep
  • sed -n '/[^0-9]/p' file?
  • ?! 是环视语法,在sedawk 中不可用。无论如何你需要否定字符类[^[:digit:]]

标签: regex csv awk sed grep


【解决方案1】:

您可以使用grep 查找所有数字行并反转结果:

grep -vE '^[0-9]+(\.[0-9]+)?$' file

^[0-9]+(\.[0-9]+)?$ 模式(使用 -E 启用的 POSIX ERE 语法)匹配完全匹配 111111.111111 类似数字的行,-v 将反转结果。

online grep demo

s="11.1111
5342
76375
sdfg23
2342lslf
jfijfojwo
395-34425
abc-24523
afhfhue3224"
grep -vE '^[0-9]+(\.[0-9]+)?$' <<< "$s"

输出:

sdfg23
2342lslf
jfijfojwo
395-34425
abc-24523
afhfhue3224

【讨论】:

    【解决方案2】:

    您可以检查任何行是否包含任何非数字字符。

    $ # -n option enables line number in output
    $ grep -n '[^0-9]' ip.txt
    1:ID
    4:sdfg23
    5:2342lslf
    6:jfijfojwo
    7:395-34425
    8:abc-24523
    9:afhfhue3224
    

    如果您需要进一步处理,awk 将适合您。以下仅为示例,您可以根据需要进行修改。

    $ awk 'NR==1{print "ID Row"; next} /[^0-9]/{print $0, NR-1}' ip.txt
    ID Row
    sdfg23 3
    2342lslf 4
    jfijfojwo 5
    395-34425 6
    abc-24523 7
    afhfhue3224 8
    

    【讨论】:

    • 如果该列有非整数,但它们是浮点数,有没有一种简单的方法可以将该列转换为整数?也许用 python 脚本?
    • 你也可以在awk中使用int函数
    • 我可以为此提出一个单独的问题,但它在一个文件中,我正在尝试使用 pandas 和 python 清理列......也许我应该问它,这似乎是一个好问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-04
    • 1970-01-01
    • 2011-08-22
    相关资源
    最近更新 更多