Sorting 单词表的多线程排序和修复
我正在整理我的词表。我想删除:所有空白,除了每个单词中的一个之外的所有副本,所有非UTF-8字符。我还想先按最小值对列表进行排序 I/O问题较少,因为我运行的是SSD,因此我希望多线程执行此脚本。下面的脚本似乎删除了很多内容Sorting 单词表的多线程排序和修复,sorting,utf-8,sed,parallel-processing,uniq,Sorting,Utf 8,Sed,Parallel Processing,Uniq,我正在整理我的词表。我想删除:所有空白,除了每个单词中的一个之外的所有副本,所有非UTF-8字符。我还想先按最小值对列表进行排序 I/O问题较少,因为我运行的是SSD,因此我希望多线程执行此脚本。下面的脚本似乎删除了很多内容 #!/bin/bash page=`grep '' -R "wordlist.txt" | iconv -f utf8 -t utf8 -c | parallel --pipe "sed -e 's/[[:space:]]/\n/g' | grep -v '^$'"
#!/bin/bash
page=`grep '' -R "wordlist.txt" | iconv -f utf8 -t utf8 -c |
parallel --pipe "sed -e 's/[[:space:]]/\n/g' | grep -v '^$'" |
parallel --pipe sed '/[^a-zA-Z1-9]/d' | parallel --pipe sort -u | parallel --pipe uniq`
echo "$page" > wordlistfixed.txt
脚本删除的内容太多。
我在列表中有5个单词“and”,它们都被删除了。没有留下“和”一词的条目。我相信这是由于使用了sort-u | uniq
。我见过几个脚本使用这个,但是一些研究让我相信sort | uniq
=sort-u
,这使得我使用sort-u | uniq
毫无意义。我之所以使用并行,是因为以前的脚本受到CPU使用的限制,而不是I/O的限制
这个单词列表的目的是做一些密码强度分析
更新:
我在这个脚本上取得了一些进展
cat in.txt | parallel --pipe sed -e 's/[[:space:]]/\n/g'| grep -v '^$' |
parallel --pipe sed '/[^a-zA-Z0-9]/d' | sort -u > out.txt
这似乎做了我想要的一切,除了删除不需要的字符。请注意,shell在管道中并行运行所有程序;您真的不需要
并行程序。由于您的最终管道不包括iconv
转换,因此不需要的字符没有全部正确删除也就不足为奇了。最后一个sed
命令删除任何包含非字母数字字符的行,这可能有点戏剧性
iconv -f utf8 -t utf8 -c wordlist.txt | # Remove invalid UTF-8 byte sequences
tr -s '[:space:]' '\n' | # Convert white space to newlines
sed '/^[:space:]*$/d' | # Delete blank lines (one at most)
sort -u > wordlistfixed.txt # Sort the data eliminating duplicates
表面上看,这应该足够了。请注意,这也避免了UOOC(无用使用cat
)奖。您能否提供一个示例,说明脚本删除了太多内容?您希望它删除什么?它实际上删除了什么?为什么需要并行?wordlist.txt中有多少个单词?《牛津英语词典》只有60万字。这个问题带来了很多其他问题。为什么页面=…
。为什么grep'-R..
。其他。。。对于您试图实现的目标,几乎可以肯定有一个更简单的解决方案。考虑编辑你的问题,包括一个小样本的单词集,你需要的那个样本的输出,以及你当前的输出。Good luck.sed不适用于UTF-8.sed'/[^a-zA-Z0-9]/d'这将删除包含非字母数字字符而非字符的行,这是您想要的吗?您可能需要:sed的//[^a-Z0-9]//g'这将删除所有非字母数字字符,同时保留行中的任何其他字符。