我有一个文本文件,其中包含大约2500万行。线路上的数据如下所示:
12ertwrtrdfger
897ertertert
545ret3w2trewt345
968587563453345
89753647565344553
我想分析最常见的前缀和后缀。在上面的例子中,你可以看到两行以897开头,两行以345结尾,我想看看哪个前缀/后缀最常见。我还想得到条形图/饼图的结果。任何数据分析程序都可以进行这种分析?
您可以尝试下面的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)
文件生成:字符串printables中有98个不同的字符。该文件包含2500万行,每行大约40个字符。
sed ... <file | sort | uniq -c
需要指定args来提取前3个或最后3个字符。
uniq -c
对每个字符串的频率进行计数。
首先处理您要按最频繁排序的| sort -nbr
。
处理| head -10
,只查看到10。
然后输入LibreCalc以获得带有图形的电子表格。
sed -E '/^(.....)(.*)$/1/' <abc.txt | sort | uniq -c >pre5.txt
最后5个,使用不同的方式指定5个字符:
sed -E '/^(.*)(.{5})$/2/' <abc.txt | sort | uniq -c >suf5.txt
然而;bug";。当整行少于5个字符时,短行将发送到输出。
我已经用下面的代码解决了我的问题:
sed abc.txt <abc.txt | cut -c 1-5 | sort | uniq -cd | sort -nbr > pre5.txt