代码之家  ›  专栏  ›  技术社区  ›  loretoparisi

从bash中的大文本文件中删除拉丁-1字符

  •  0
  • loretoparisi  · 技术社区  · 6 年前

    我有一些大数据集纯文本文件(wikipedia文章),我必须删除拉丁-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
    

    我只想

    ਕਾਲਜ
     ਅਡੋਲਫ ਹਿਟਲਰ ਨੇ ਦੇਸ਼ ਵਿਚ ਕਮਿਊਨਿਸਟ ਪਾਰਟੀ ਬਣਾਉਣ ਦੀ ਇਜਾਜ਼ਤ ਦੇਣ ਤੋਂ ਨਾਂਹ ਕਰ ਦਿਤੀ।
    
     ਕਬਜਾ
    

    并最终修剪出微不足道的空白线条。 我采用的方法如下

    <?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 把台词流出来。

    看见 here

    [更新] 我在这里报告的是从提出的替代方法得到的一些结果

    使用 regex

    A 文件

    $ time tr -d "[:alnum:][:punct:]" < wiki.as.txt > wiki.as.test.txt
    
    real    0m2.990s
    user    0m2.818s
    sys 0m0.088s
    

    A 约100MB 文件

    $ time tr -d "[:alnum:][:punct:]" < wiki.gu.txt > wiki.gu.test.txt
    
    real    0m7.322s
    user    0m6.772s
    sys 0m0.282s
    

    A 文件

    $ time tr -d "[:alnum:][:punct:]" < wiki.ta.txt > wiki.ta.test.txt
    
    real    0m35.973s
    user    0m33.498s
    sys 0m1.254s
    

    A 文件

    $ time tr -d "[:alnum:][:punct:]" < wiki.ja.1.txt > wiki.ja.1.test.txt
    
    real    1m5.409s
    user    1m0.669s
    sys 0m2.068s
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Paul Hodges    6 年前

    试试正则表达式。

    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,因为我在这里没有测试设置。它可能有语法问题和/或更糟。幸运的话,有人会编辑它或者提供更好的解决方案,或者至少评论并指出我可能做错了什么。