sed语言翻译脚本-提高长文本的效率

sed语言翻译脚本-提高长文本的效率,sed,Sed,这是我的问题。我是一名西班牙语翻译,我有一个非常长的西班牙语-英语词汇表文件——50K条目的词条。此外,我还有一个超过1K条目的停止词词汇表。我想从我计划翻译的文本中删除这些条目。因此,我构建了一个sed脚本,然后从词汇表中构建了两个以上的sed脚本,它们进行剥离,只留下未翻译的文本(因此我不必两次解决相同的问题)。这很有效,但问题是长文本需要很长的时间,有时长达15分钟。这是不可避免的,还是有更有效的方法 以下是主要脚本: #/垃圾箱/垃圾箱 在=“$(日期+%s)”之前 #wordstxt=

这是我的问题。我是一名西班牙语翻译,我有一个非常长的西班牙语-英语词汇表文件——50K条目的词条。此外,我还有一个超过1K条目的停止词词汇表。我想从我计划翻译的文本中删除这些条目。因此,我构建了一个sed脚本,然后从词汇表中构建了两个以上的sed脚本,它们进行剥离,只留下未翻译的文本(因此我不必两次解决相同的问题)。这很有效,但问题是长文本需要很长的时间,有时长达15分钟。这是不可避免的,还是有更有效的方法

以下是主要脚本:

#/垃圾箱/垃圾箱
在=“$(日期+%s)”之前
#wordstxt=$(wc-w<$1)
#mintime=$(expr“$wordstxt/200”| bc-l)
#maxtime=$(expr“$wordstxt/175”| bc-l)
#echo“估计处理时间:介于$mintime和$maxtime秒之间。”
塞德
s/\,/\n/g#去掉所有逗号
s/\?/\n/g带问号
s/\*/\n/g带星号
s/\/\n/g#带感叹号
s/:/\n/g#带冒号
s/\-/\n/g带连字符
s/\./\n/g#剥离周期
s/«/\n/g#带左欧元报价
s/»/\n/g#去掉右边的欧元报价
s/“/\n/g#带斜线的美国报价
s/\“/\n/g#带左引号
s/(/\n/g#带左栏
s/)/\n/g#右翼剥离
s/\[/\n/g#带左支架
s/\]/\n/g#带右支架
s/
s/-/\n/g#m-dash
s/\–\/\n/g#n-破折号
s/../\n/g#将省略作为单个字符,而不是三个句点
s/;/\n/g#带分号
s/[0-9]/\n/g#去掉所有数字,替换为返回值
“$1>$1.z.tmp
#回声“标点符号消除。”
#cp.././Spanish\to\English\projects/glossary/stoplist.txt。
塞德
s//^\//g#带前导空间
s/\$/#带尾随空格
/^$/d#删除空行
s/\./\n/g#剥离周期
s/\/\\/g将空格转换为文字
s/^/s\/#开始替换
s/$/\/\\n\/g/#结束替换
1 s/^/\\\!\/bin\/sed\-f\n\ns\/\[0 \-9\]\/\/g\ns\/\\\\\/\\\\/g\ns\/\\\.\\\\/\\\\\\\/n\/g\n\n/
'stoplist.txt>stoplist.sed
chmod+x stoplist.sed
呼应“消除停止语”
./stoplist.sed$1.z.tmp>$1.0.tmp
sed's/\([A-Za-z\]*\t\)./\1/'SpanishGlossary.utf8>tempgloss.2.txt
#回音“目标短语”
排序-u tempgloss.2.txt>tempgloss.3.txt
awk'{print length(),$0 |“sort-rn”}'tempgloss.3.txt>tempgloss.4.txt
#echo“按长度排序的列表”
#echo“正在创建新的sed脚本。”#这会影响sed脚本,而不是输出文件。
塞德
s/[0-9]/g#去掉所有数字
s//^\//g#带前导空格——由于排序的原因,所有行都有前导空格
/^$/d#删除空行
s/\/\\//g将文本斜杠转换为文字
s/“/\n/g#带引号
s/\t//g#带标签
s/\./\n/g#剥离周期
s/'\''/\''''\''''/g将直接撇号转换为文字
s/'\''/\''''\''''/g将卷曲撇号转换为文字
s/\/\\/g将空格转换为文字
/^.\{0,5\}$/d#删除少于五个字符的行
s/^/s\/\\b/#开始替换
s/$/\\b\/\\n\/g/#结束替换
1 s/^/#!\\/bin\/sed\\-f\n\ns\/\[0 \-9\]\/\/g\ns\/\\\\/\\\\/g\ns\/\\\.\\\\/\[n\/\/g\n\n/
'tempgloss.4.txt>gloss.sed
#echo“创建了光泽的.sed”
chmod+x.sed
echo“删除现有条目。这可能需要一段时间。”
./solished.sed$1.0.tmp>$1.1.tmp
echo“现在正在清理线路。”
sed-e'
s/\$/#带尾随空格
s//^\*//g#去掉任何和所有前导空格
s/\el$//g#从末尾去掉“el”
s/\la$//g#从末尾去掉“la”
s/\los//g#从末尾去掉“los”
s/\las//g#从末尾去掉“las”
s/\o$//g#从末尾去掉“o”
s/\y$//g#从末尾去掉“y”
s/\$/#带尾随空格(是,再次)
“$1.1.tmp>$1.2.tmp
echo“创建ngrams”
/ngrams 5<$1.2.tmp>$1.3.tmp 2>/dev/null
linecount=“$(wc-l<$1.3.tmp)”
#echo$linecount“行”
如果[“$linecount”-gt“1000”]
然后
回显“消除单个实例”
sed'/^1\t/d'$1.3.tmp>$1.4.tmp
其他的
echo“少于1000个条目,所以保留所有条目。”
cp$1.3.tmp$1.4.tmp
fi
sed-e'
s/[0-9]/g#去掉所有数字
s/^\t//g#条带前导选项卡
s//^\*//g#去掉任何和所有前导空格
/^.\{0,7\}$/d#删除少于六个字符的行
s/\$/#带尾随空格(是,再次)
#s/$/\t/#添加到选项卡中
“$1.4.tmp>$1.csv”
echo“寻找重复项。”
sh./重复数据消除$1.csv
wordstxt=$(wc-w<$1)
#echo$wordstxt
wordslist=$(wc-w<$1.csv)
#echo$wordslist
wordspercent=$(echo“scale=4;$wordslist/$wordstxt”| bc-l)
wordspercentage=$(回显“$wordspercent*100”| bc-l)
“$(日期+%s)”之后
已用秒数=“$(expr$之后-$之前)”
速率=$(echo“scale=3;$wordstxt/$passed_seconds”| bc-l)
echo“已创建”$1.csv”,剩余$wordspercentage%,以“$Expressed_seconds”秒为单位。#,有效速率为每秒“$rate”个字
rm tempgloss.*.txt
rm*.tmp
rm.sed

您可以将其中许多功能组合在一起,以提高速度

s/[\,\?\*\!:\-\。]/\n/g

用awk重写脚本,它将在几秒钟而不是几分钟内运行,而且更简洁、更简单、更清晰。sed是一个在一行上进行简单替换的优秀工具。对于任何其他内容,只需使用awk即可。

有趣的问题,但我没有时间重写您的脚本。其他人可能会。您可以将单词替换组合在一起ke
s/\el$|\los\la$/
。对包含行尾标记
$
的字符串使用“/g”可能不会花费额外的时间,但会使其他人更难理解您的代码。您还可以