2013-03-24 4 views
0

У меня есть очень большой текстовый файл со всеми типами языков, таких как английский, японский, китайский ... Я хочу получить количество строк, содержащих китайские символы.Как я могу получить количество строк, содержащих китайские символы?

Я думаю, что это можно сделать с помощью grep и wc -l, но как я могу на самом деле выполнить эту работу?

cat filename | grep -P "[\x{4e00}-\x{9fcc}]" | wc -l 

Эта команда не работает, и имеет сообщение об ошибке:

.grep: значение символа в \ х {...} последовательность слишком велико.

+0

Какой тип grep вы используете ('grep -V')? – nwellnhof

+0

Вам не нужно кататься в GREP. Вы можете просто использовать шаблон «grep -opt» «filename». Не знаю. а вот настройка. – FrankieTheKneeMan

ответ

1

Если вы не против использования Python, вы можете наблюдать, какие символы используются в файле с помощью модуля unicodedata. Пример с Nagari входом и Python 3:

>>> import unicodedata 
>>> word = "ब्र॑ह्मन्" 
>>> len(word) 
9 
>>> for char in word: 
...  unicodedata.name(char) 
... 
'DEVANAGARI LETTER BA' 
'DEVANAGARI SIGN VIRAMA' 
'DEVANAGARI LETTER RA' 
'DEVANAGARI STRESS SIGN UDATTA' 
'DEVANAGARI LETTER HA' 
'DEVANAGARI SIGN VIRAMA' 
'DEVANAGARI LETTER MA' 
'DEVANAGARI LETTER NA' 
'DEVANAGARI SIGN VIRAMA' 

Конечно, сначала нужно искать имена Юникода глифов, используемых в каждом сценарии. Таблицу символов unicode можно найти here. Некоторые конкретные таблицы для каждого языка даются на одном сайте.

После того, как вы определили диапазон символов, которые вы хотите, чтобы поймать, остальные довольно легко:

all_chars = ['ब', '्', 'र', '॑', 'ह', '्','म', 'न', '्'] 

i = 0 
with open('thefile') as f: 
    for line in f.readline(): 
     i += 1 
     for char in all_chars: 
      if char in line: 
       print("char %s found in line %s" % (char, i)) 
       continue 
1

Поскольку вы указываете опцию -P, вы, вероятно, с помощью GNU Grep. Сообщение об ошибке появляется из PCRE, совместимой с Perl библиотеки регулярных выражений. Итак, либо ваша версия PCRE не совместима с Perl или GNU grep не использует функции Unicode PCRE.

Я просто пытаюсь запустить Perl непосредственно:

perl -ne 'print if /[\x{4e00}-\x{9fcc}]/' filename | wc -l 

Edit: я мог проверить это на системе Linux сегодня, и я обнаружил, что это, вероятно, вызвано this bug in grep (PCRE_UTF8 не установлен для локалей UTF-8), которая была исправлена ​​в this commit. Официального релиза с исправлением пока нет, но он должен быть включен в следующую версию (2.15).

Смежные вопросы