从 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 更糟。幸运的话,有人会对其进行编辑或提供更好的解决方案,或者至少发表评论并指出我可能做错的地方。

希望对您有所帮助。