打印不是数字的行

时间:2019-11-15 14:47:42

标签: regex csv awk sed grep

很简单,我有一个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

2 个答案:

答案 0 :(得分:3)

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

$ # -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

答案 1 :(得分: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