如何分析文本文件中字符的频率
How to analyze frequency of characters in a text file
我有一个包含大约 2500 万行的文本文件。行上的数据类似如下:
12ertwrtrdfger
897二三四
545ret3w2trewt345
968587563453345
89753647565344553
我想分析最常见的前缀和后缀。在上面的示例中,您可以看到 2 行以 897 开头,两行以 345 结尾,我想看看哪个 prefix/suffixes 出现频率最高。我也想得到 bar/piechart 的结果。任何数据分析程序都可以进行这种分析吗?
sed ... <file | sort | uniq -c
args需要指定提取前3个字符或后3个字符。
uniq -c
统计每个字符串出现的频率。
添加第 | sort -nbr
个您想按最频繁排序的第一个。
点击 | head -10
以仅查看到 10。
然后输入 LibreCalc 以获得带有图形的电子表格。
sed -E '/^(.....)(.*)$//' <abc.txt | sort | uniq -c >pre5.txt
最后 5 个,使用不同的方式指定恰好 5 个字符:
sed -E '/^(.*)(.{5})$//' <abc.txt | sort | uniq -c >suf5.txt
但是,有一个“错误”。当整行少于5个字符时,短行将被发送到输出。
您可以尝试下面的 python 代码。它 运行 在 1.5 分钟内处理了一个与您的描述相符的 1GB 文件。它有 922180 个不同的前缀和 891532 个不同的后缀。
pre = {}
suf = {}
with open('input.txt', 'r') as f:
for line in f:
p, s = line[:3], line[-4:-1]
pre[p] = pre.get(p, 0) + 1
suf[s] = suf.get(s, 0) + 1
df_pre = pd.DataFrame([[e[0], e[1]] for e in pre.items()])
df_suf = pd.DataFrame([[e[0], e[1]] for e in suf.items()])
df_pre.sort_values([1], ascending=False)
df_suf.sort_values([1], ascending=False)
文件生成:string.printables 中有 98 个不同的字符可用。
该文件包含 2500 万行,每行约 40 个字符。
我已经用下面的代码解决了我的问题:
sed abc.txt <abc.txt | cut -c 1-5 | sort | uniq -cd | sort -nbr > pre5.txt
我有一个包含大约 2500 万行的文本文件。行上的数据类似如下:
12ertwrtrdfger
897二三四
545ret3w2trewt345
968587563453345
89753647565344553
我想分析最常见的前缀和后缀。在上面的示例中,您可以看到 2 行以 897 开头,两行以 345 结尾,我想看看哪个 prefix/suffixes 出现频率最高。我也想得到 bar/piechart 的结果。任何数据分析程序都可以进行这种分析吗?
sed ... <file | sort | uniq -c
args需要指定提取前3个字符或后3个字符。
uniq -c
统计每个字符串出现的频率。
添加第 | sort -nbr
个您想按最频繁排序的第一个。
点击 | head -10
以仅查看到 10。
然后输入 LibreCalc 以获得带有图形的电子表格。
sed -E '/^(.....)(.*)$//' <abc.txt | sort | uniq -c >pre5.txt
最后 5 个,使用不同的方式指定恰好 5 个字符:
sed -E '/^(.*)(.{5})$//' <abc.txt | sort | uniq -c >suf5.txt
但是,有一个“错误”。当整行少于5个字符时,短行将被发送到输出。
您可以尝试下面的 python 代码。它 运行 在 1.5 分钟内处理了一个与您的描述相符的 1GB 文件。它有 922180 个不同的前缀和 891532 个不同的后缀。
pre = {}
suf = {}
with open('input.txt', 'r') as f:
for line in f:
p, s = line[:3], line[-4:-1]
pre[p] = pre.get(p, 0) + 1
suf[s] = suf.get(s, 0) + 1
df_pre = pd.DataFrame([[e[0], e[1]] for e in pre.items()])
df_suf = pd.DataFrame([[e[0], e[1]] for e in suf.items()])
df_pre.sort_values([1], ascending=False)
df_suf.sort_values([1], ascending=False)
文件生成:string.printables 中有 98 个不同的字符可用。 该文件包含 2500 万行,每行约 40 个字符。
我已经用下面的代码解决了我的问题:
sed abc.txt <abc.txt | cut -c 1-5 | sort | uniq -cd | sort -nbr > pre5.txt