我有一个 csv 数据集 Student.csv,包含 1000 行和 10 列。
示例数据如下所示:
s_id,s_name,s_dob,s_class,s_marks,s_parentname,
1,abc,1/1/18,5,49,def,
2,xyz,1/1/17,4,85,abc,
3,pqr,1/2/18,2,78,mnp,
在此数据集中,我想将行中包含“abc”的所有日期复制到文本文件中。
预期输出:
text.txt
1/1/18
1/1/17
答案1
grep abc student.csv | cut -d, -f 3 >text.txt
这将首先从任意位置提取student.csv
包含子字符串的每一行abc
,然后从这些行中删除第三个逗号分隔列并将它们存储在text.txt
.
根据问题中给出的数据,text.txt
最终将包含
1/1/18
1/1/17
这依赖于原始文件是简单的CSV 文件,即没有包含嵌入逗号或换行符的字段。
您想搜索abc
为完整的单词,然后使用grep -w abc
代替 just grep abc
。这将避免匹配包含诸如 之类的字符串的行abcde
,但仍会匹配包含 的字段abc xyz
。
如果您正在查找包含任意复杂字符串的字段(仍在简单的 CSV 文件中),并且需要该字段完全等于该字符串,那么您必须迭代每行上的字段:
string='some string' awk -F, '{ for (i = 1; i <= NF; ++i) if ($i == ENVIRON["string"]) { print $3 ; next } }' student.csv
此awk
代码遍历每一行的所有字段,查找一个逗号分隔的字段,其值与环境变量的值完全相同string
。一旦找到这样的字段,就会打印第 3 个字段。
答案2
使用米勒(https://github.com/johnkerl/miller) 从...开始
s_id,s_name,s_dob,s_class,s_marks,s_parentname,
1,abc,1/1/18,5,49,def,
2,xyz,1/1/17,4,85,abc,
3,pqr,1/2/18,2,78,mnp,
和跑步
mlr --nidx --fs "," filter -S '$2=="abc"' then cut -f 3 input.txt >output.txt
你将会拥有
1/1/18
答案3
鉴于您需要全场比赛:
$ awk -F, 'FNR==1{print FILENAME} /(^|,)abc(,|$)/{print $3}' file
file
1/1/18
1/1/17
或者如果abc
实际上可以包含您想要按字面处理的 RE 元字符,因此您需要执行字符串而不是正则表达式匹配:
$ awk -F, 'FNR==1{print FILENAME} index(","$0",",",abc,"){print $3}' file
file
1/1/18
1/1/17
或打印列标题:
$ awk -F, 'FNR==1{print $3} /(^|,)abc(,|$)/{print $3}' file
s_dob
1/1/18
1/1/17
$ awk -F, 'FNR==1{print $3} index(","$0",",",abc,"){print $3}' file
s_dob
1/1/18
1/1/17