【问题标题】:Using grep, to search the files in the directories, how can I get the occurrence count of each word using a list.txt(or csv)?使用 grep 搜索目录中的文件,如何使用 list.txt(或 csv)获取每个单词的出现次数?
【发布时间】:2021-11-18 16:01:04
【问题描述】:

在 list.txt 我有:

Lucas
Viny
Froid

在当前目录中,我有很多包含名称的 csv 文件。

我需要知道列表中的每个单词在这些 csv 文件中出现了多少次。

我试过了:

grep -riohf list.txt . | wc -lw

但它只返回计数。我需要知道每个计数指的是哪个单词。

我只需要这样的东西:

Lucas 353453
Viny 9234
Froid 934586

【问题讨论】:

  • 所有 csv 文件是否具有相同的输入格式。共享 1 或 2 个 csv 文件的样本
  • 我会使用 awk 脚本而不是 grep。
  • 是的,所有的 csv 文件都有相同的格式。但它们非常庞大,有很多列。
  • 我以前从未使用过 awk。我会研究一下。谢谢。

标签: linux shell grep wc


【解决方案1】:

假设你有这些文件:

$ cat list.txt
Lucas
Viny
Froid

$ cat 1.csv
Lucas,Viny,Bob
Froid

$ cat 2.csv
Lucas,Viny,Froid
Lucas,Froid

您可以使用以下awk 来统计与列表匹配的字段:

awk -F ',' 'FNR==NR{cnt[$1]; next}
{for (i=1; i<=NF; i++) if ($i in cnt) cnt[$i]++}
END{for (e in cnt) print e, cnt[e]}' list.txt {1..2}.csv
Viny 2
Lucas 3
Froid 3

另一种方法是使用管道来计算 uniq 字段:

cat {1..2}.csv | tr , "\n" | sort | uniq -c
   1 Bob
   3 Froid
   3 Lucas
   2 Viny

然后grep那个:

cat {1..2}.csv | tr , "\n" | grep -Fxf list.txt | sort | uniq -c
   3 Froid
   3 Lucas
   2 Viny

【讨论】:

  • 这些适用于引用的 csv。如果有,请使用 csv 解析器,例如 ruby​​、python 或 perl。
【解决方案2】:

在循环中使用grepwc,您可以计算每个单词出现的次数而不仅仅是行数。

while read -r line; do
    count=$(grep -o "$line" *.csv | wc -l)
    echo "$line $count"
done < list.txt

【讨论】:

    猜你喜欢
    • 2010-12-27
    • 2019-09-01
    • 1970-01-01
    • 2014-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-28
    相关资源
    最近更新 更多