很简单,我有一个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
答案 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语法)与完全匹配111
或111.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