我有一個非常大的純文本文件,包括各種語言,如英語,日語,中文......我想要得到包含中文字符的行數。如何獲取包含中文字符的行數?
我認爲這可以使用grep和wc -l來完成,但我怎麼能夠真正做到這個工作?
cat filename | grep -P "[\x{4e00}-\x{9fcc}]" | wc -l
此命令不起作用,並有此錯誤消息:
.grep:在\ X {...}序列太大字符值。
我有一個非常大的純文本文件,包括各種語言,如英語,日語,中文......我想要得到包含中文字符的行數。如何獲取包含中文字符的行數?
我認爲這可以使用grep和wc -l來完成,但我怎麼能夠真正做到這個工作?
cat filename | grep -P "[\x{4e00}-\x{9fcc}]" | wc -l
此命令不起作用,並有此錯誤消息:
.grep:在\ X {...}序列太大字符值。
如果您不介意使用Python,您可以藉助unicodedata
模塊觀察文件中使用的字符。例如與nāgarī輸入和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名稱。一個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
既然你指定-P
選項,你可能會使用GNU的grep。該錯誤消息似乎來自Perl兼容的正則表達式庫PCRE。所以要麼你的PCRE版本不夠Perl兼容或者 GNU grep不使用PCRE的Unicode功能。
我只是嘗試直接運行Perl:
perl -ne 'print if /[\x{4e00}-\x{9fcc}]/' filename | wc -l
編輯:我可以在Linux系統上的今天測試這一點,而且我發現,它可能是由this bug in grep引起的(PCRE_UTF8未設置對於UTF-8語言環境)已在this commit中修復。目前還沒有正式版本,但它應該包含在下一個版本中(2.15)。
你使用了什麼樣的grep('grep -V')? – nwellnhof 2013-03-24 16:49:19
你不必陷入GREP。你可以使用'grep -opt'模式「文件名」。我知道,不是超級有用。但一個調整。 – FrankieTheKneeMan 2013-03-24 20:24:00