使用正则表达式从 CSV 文件中提取数据

使用正则表达式从 CSV 文件中提取数据

我有一个如下所示的 CSV 文件:

1004051,[email protected],abc,eaf
1004052,[email protected],edf,eaf
1004053,[email protected],abc,eaf
1004054,[email protected],ghi,eaf

我只想提取第二个字段以字符串开头的行abc_

1004051,[email protected],abc,eaf
1004053,[email protected],abc,eaf

答案1

再次假设这不需要解析来避免,在第一个字段中嵌入 s 那么你sed也可以这样做

sed -nE "/[^,]+,abc/p" file

1004051,[email protected],abc,eaf
1004053,[email protected],abc,eaf

不要-n打印每一行,而是使用E扩展正则表达式进行测试,查找不包含任何,with[^,]+且后跟 的序列,abc。然后仅p在有匹配项时才进行 rint

答案2

$ awk -F, '$2 ~ /^abc_/' file.csv
1004051,[email protected],abc,eaf
1004053,[email protected],abc,eaf

这使用awk逗号作为字段分隔符。它测试第二个字段 ( $2) 是否以文本开头abc_。这是通过正则表达式完成的^abc_。如果测试成功,则打印当前行。


如果您的输入文件不是“简单 CSV”文件,而是可能具有包含嵌入逗号和换行符的引用字段的 CSV 文件,那么您需要使用 CSV 解析器。例如,您可能想csvgrep使用csvkit工具包:

$ csvgrep -H -c 2 -r '^abc_' file.csv
a,b,c,d
1004051,[email protected],abc,eaf
1004053,[email protected],abc,eaf

这用于csvgrep提取第二列以字符串 开头的所有记录abc_。输出的第一行是csvgrep为您创建的标题行,因为您的输入文件不包含标题行。如果您不想要这个,请通过传递结果来删除它sed 1d

$ csvgrep -H -c 2 -r '^abc_' file.csv | sed 1d
1004051,[email protected],abc,eaf
1004053,[email protected],abc,eaf

也可以看看csvgrep --help

答案3

Python

#!/usr/bin/python
import re
d=re.compile(r'abc')
l=open('filename','r')
for m in l:
    k=m.split(",")
    if re.search(d,k[1]):
        print m.strip()

输出

1004051,[email protected],abc,eaf
1004053,[email protected],abc,eaf

相关内容