CSV 数据集到文本数据集

CSV 数据集到文本数据集

我有一个 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

相关内容