我有一个如下所示的 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