处理百万无空格单词:用Awk生成Bigram、Trigram(最多7列)
用Awk生成单词的N-gram(最多7列)
需求说明
处理包含百万级无空格单词(支持Unicode)的文本文件,为每个单词生成从1-gram到7-gram的前缀片段(最长单词长度为7),不足7个片段的位置补空,最终用逗号分隔输出,格式匹配示例要求。
核心Awk脚本
直接指定最大长度为7时,使用以下命令:
BEGIN { max_len=7; OFS="," } { output = "" for (i=1; i<=max_len; i++) { fragment = (i <= length($0)) ? substr($0, 1, i) : "" output = output fragment OFS } print output }
动态适配最长单词长度
如果不想手动指定max_len,可以先自动获取文件中最长单词的长度,再传递给Awk:
# 先获取最长单词的长度 max_length=$(awk '{print length}' test.txt | sort -nr | head -1) # 运行Awk脚本 awk -v max_len="$max_length" 'BEGIN {OFS=","} { output = "" for (i=1; i<=max_len; i++) { fragment = (i <= length($0)) ? substr($0, 1, i) : "" output = output fragment OFS } print output }' test.txt
脚本说明
BEGIN块:初始化最大列数max_len和输出分隔符OFS为逗号- 逐行处理每个单词:循环生成1到max_len长度的前缀片段,单词长度不足时对应位置留空
- 拼接所有片段后直接输出,格式完全匹配示例要求
测试验证
用示例输入文件test.txt运行脚本,输出结果如下:
w,wo,wor,work,worke,worked, w,wo,wor,work,worki,workin,working w,wo,wor,work,works,, t,te,tes,test,teste,tested,, t,te,tes,test,tests,, f,fi,fin,find,,,, f,fo,fou,foun,found,,
内容的提问来源于stack exchange,提问作者shantanuo
相关产品推荐
相关产品推荐

