从 bash 中的大文本文件中删除 latin-1 字符
remove latin-1 character from large text file in bash
我有一些大型数据集纯文本文件(维基百科文章),我必须删除 latin-1 字符,如下所示:
kemer } şehir kır toplam }}
use specific terminology . for example , it is often more appropriate for people or things from ethiopia ( a country in africa ) to be described as ethiopian , not carelessly ( with the risk of stereotyping ) as african .
bat avg .
label ਕਾਲਜ
ਅਡੋਲਫ ਹਿਟਲਰ ਨੇ ਦੇਸ਼ ਵਿਚ ਕਮਿਊਨਿਸਟ ਪਾਰਟੀ ਬਣਾਉਣ ਦੀ ਇਜਾਜ਼ਤ ਦੇਣ ਤੋਂ ਨਾਂਹ ਕਰ ਦਿਤੀ।
alt }
if not extra_units then
utc_offset +
ਕਬਜਾ ( )
demographics _title regional
我只想点赞
ਕਾਲਜ
ਅਡੋਲਫ ਹਿਟਲਰ ਨੇ ਦੇਸ਼ ਵਿਚ ਕਮਿਊਨਿਸਟ ਪਾਰਟੀ ਬਣਾਉਣ ਦੀ ਇਜਾਜ਼ਤ ਦੇਣ ਤੋਂ ਨਾਂਹ ਕਰ ਦਿਤੀ।
ਕਬਜਾ
最终 trim 白色 space 行是微不足道的。
我使用的方法如下
<?php
$in = fopen('php://stdin','rb');
while($line = stream_get_line($in, 64000)) {
foreach(str_split($line) as $char) {
$ordChar = ord($char);
if($ordChar > 127 || $ordChar <= 31) {
echo $char;
}
}
}
像cat wiki.hi.txt | php -d memory_limit=1024M escape_latin.php > wiki.hi.esc.txt
一样使用
这种方法工作正常,唯一的问题是随着文件大小的增加,性能变得最差,正如我在我正在处理的文件上看到的那样 watch du -h filename
。我很惊讶,因为我正在本地磁盘上工作,并且我正在使用 stream_get_line
来获取流中的行。
我在 python 中尝试过相同的方法,但我在 ~1GB 的文件大小下获得了几乎相同的性能。
有关详细信息,请参阅 here。
[更新]
我在这里报告了一些建议的替代方法的结果
使用 regex
方法,这似乎产生了几乎相同的输出文件:
一个~50MB个文件
$ time tr -d "[:alnum:][:punct:]" < wiki.as.txt > wiki.as.test.txt
real 0m2.990s
user 0m2.818s
sys 0m0.088s
一个~100MB个文件
$ time tr -d "[:alnum:][:punct:]" < wiki.gu.txt > wiki.gu.test.txt
real 0m7.322s
user 0m6.772s
sys 0m0.282s
一个~600MB个文件
$ time tr -d "[:alnum:][:punct:]" < wiki.ta.txt > wiki.ta.test.txt
real 0m35.973s
user 0m33.498s
sys 0m1.254s
一个~1000MB (1GB)个文件
$ time tr -d "[:alnum:][:punct:]" < wiki.ja.1.txt > wiki.ja.1.test.txt
real 1m5.409s
user 1m0.669s
sys 0m2.068s
试试正则表达式。
如果您 运行 它来自 CLI,请尝试类似
tr -d "[:alnum:][:punct:]" < wiki.hi.txt > wiki.hi.esc.txt
如果你喜欢在 php 中做同样的事情 -
<?php
$in = fopen('php://stdin','rb');
while($line = stream_get_line($in, 64000)) {
echo preg_replace('/[:alnum:][:punct:]/', '', $line);
}
但是请检查这些以确保它们正在做您想要的 - 尤其是。 php,因为我在这里没有测试设置。它可能有语法问题 and/or 更糟。幸运的话,有人会对其进行编辑或提供更好的解决方案,或者至少发表评论并指出我可能做错的地方。
希望对您有所帮助。
我有一些大型数据集纯文本文件(维基百科文章),我必须删除 latin-1 字符,如下所示:
kemer } şehir kır toplam }}
use specific terminology . for example , it is often more appropriate for people or things from ethiopia ( a country in africa ) to be described as ethiopian , not carelessly ( with the risk of stereotyping ) as african .
bat avg .
label ਕਾਲਜ
ਅਡੋਲਫ ਹਿਟਲਰ ਨੇ ਦੇਸ਼ ਵਿਚ ਕਮਿਊਨਿਸਟ ਪਾਰਟੀ ਬਣਾਉਣ ਦੀ ਇਜਾਜ਼ਤ ਦੇਣ ਤੋਂ ਨਾਂਹ ਕਰ ਦਿਤੀ।
alt }
if not extra_units then
utc_offset +
ਕਬਜਾ ( )
demographics _title regional
我只想点赞
ਕਾਲਜ
ਅਡੋਲਫ ਹਿਟਲਰ ਨੇ ਦੇਸ਼ ਵਿਚ ਕਮਿਊਨਿਸਟ ਪਾਰਟੀ ਬਣਾਉਣ ਦੀ ਇਜਾਜ਼ਤ ਦੇਣ ਤੋਂ ਨਾਂਹ ਕਰ ਦਿਤੀ।
ਕਬਜਾ
最终 trim 白色 space 行是微不足道的。 我使用的方法如下
<?php
$in = fopen('php://stdin','rb');
while($line = stream_get_line($in, 64000)) {
foreach(str_split($line) as $char) {
$ordChar = ord($char);
if($ordChar > 127 || $ordChar <= 31) {
echo $char;
}
}
}
像cat wiki.hi.txt | php -d memory_limit=1024M escape_latin.php > wiki.hi.esc.txt
这种方法工作正常,唯一的问题是随着文件大小的增加,性能变得最差,正如我在我正在处理的文件上看到的那样 watch du -h filename
。我很惊讶,因为我正在本地磁盘上工作,并且我正在使用 stream_get_line
来获取流中的行。
我在 python 中尝试过相同的方法,但我在 ~1GB 的文件大小下获得了几乎相同的性能。
有关详细信息,请参阅 here。
[更新] 我在这里报告了一些建议的替代方法的结果
使用 regex
方法,这似乎产生了几乎相同的输出文件:
一个~50MB个文件
$ time tr -d "[:alnum:][:punct:]" < wiki.as.txt > wiki.as.test.txt
real 0m2.990s
user 0m2.818s
sys 0m0.088s
一个~100MB个文件
$ time tr -d "[:alnum:][:punct:]" < wiki.gu.txt > wiki.gu.test.txt
real 0m7.322s
user 0m6.772s
sys 0m0.282s
一个~600MB个文件
$ time tr -d "[:alnum:][:punct:]" < wiki.ta.txt > wiki.ta.test.txt
real 0m35.973s
user 0m33.498s
sys 0m1.254s
一个~1000MB (1GB)个文件
$ time tr -d "[:alnum:][:punct:]" < wiki.ja.1.txt > wiki.ja.1.test.txt
real 1m5.409s
user 1m0.669s
sys 0m2.068s
试试正则表达式。
如果您 运行 它来自 CLI,请尝试类似
tr -d "[:alnum:][:punct:]" < wiki.hi.txt > wiki.hi.esc.txt
如果你喜欢在 php 中做同样的事情 -
<?php
$in = fopen('php://stdin','rb');
while($line = stream_get_line($in, 64000)) {
echo preg_replace('/[:alnum:][:punct:]/', '', $line);
}
但是请检查这些以确保它们正在做您想要的 - 尤其是。 php,因为我在这里没有测试设置。它可能有语法问题 and/or 更糟。幸运的话,有人会对其进行编辑或提供更好的解决方案,或者至少发表评论并指出我可能做错的地方。
希望对您有所帮助。