【发布时间】:2021-10-10 17:55:38
【问题描述】:
使用 Bash,我想从 CSV 文件中获取电子邮件地址列表,以在其上执行递归 grep 搜索,以查找在特定元数据 XML 文件中寻找匹配项的一堆目录,然后还进行统计增加我在整个目录树中为每个地址找到多少个结果(即更新同一个 CSV 文件中的计数字段)。
accounts.csv 看起来像这样:
更新以更准确地反映真实数据
email,date,bar,URL,"something else",tally
address@somewhere.com,21/04/2015,1.2.3.4,https://blah.com/,"blah blah",5
something@that.com,17/06/2015,5.6.7.8,https://blah.com/,"lah yah",0
another@here.com,7/08/2017,9.10.11.12,https://blah.com/,"wah wah",1
例如,如果我们将address@somewhere.com 从列表中放入$email,则运行
grep -rl "${email}" --include=\*_meta.xml --only-matching | wc -l
然后将该结果添加到tally 列。
目前我可以使用
获取该 CSV 文件的第一列(减去标题/第一行)awk -F"," '{print $1}' accounts.csv | tail -n +2
但我不知道如何进行循环和以及将结果写回 CSV 文件...
例如,如果我们运行another@here.com
grep -rl "${email}" --include=\*_meta.xml --only-matching | wc -l
结果是17,我怎样才能将那行更新为:
another@here.com,7/08/2017,9.10.11.12,https://blah.com/,"wah wah",17
awk 或 sed 是否有可能?
这就是我要做的:
#!/bin/bash
# make temporary list of email addresses
awk -F"," '{print $1}' accounts.csv | tail -n +2 > emails.tmp
# loop over each
while read email; do
# count how many uploads for current email address
grep -rl "${email}" --include=\*_meta.xml --only-matching | wc -l
done < emails.tmp
XML 元数据如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<metadata>
<identifier>SomeTitleNameGoesHere</identifier>
<mediatype>audio</mediatype>
<collection>opensource_movies</collection>
<description>example <br /></description>
<subject>testing</subject>
<title>Some Title Name Goes Here</title>
<uploader>another@here.com</uploader>
<addeddate>2017-05-28 06:20:54</addeddate>
<publicdate>2017-05-28 06:21:15</publicdate>
<curation>[curator]email@address.com[/curator][date]20170528062151[/date][comment]checked for malware[/comment]</curation>
</metadata>
【问题讨论】:
-
电子邮件地址的域部分可能包含逗号(请参阅here),因此我认为您不能简单地使用带有逗号的 awk 作为字段分隔符。
-
这是一个非常史诗般的边缘案例,不适用于我的数据,但可以肯定。 :+1: