Biorąc pod uwagę plik w formacie UTF-8, zawierający znaki w różnych językach, w jaki sposób mogę uzyskać liczbę unikalnych znaków, które zawiera, z wyłączeniem wybranej liczby symboli (np. "!", "@", " # ",". ") z tej liczby?Jak policzyć liczbę unikalnych znaków w pliku?
Odpowiedz
Korzystanie z Perl jedno-liner:
echo -e "aba\ncfg!ഡ.#g" | perl -C7 -ne 'for(split(//)){if ($_ !~ /[[email protected]#.]/) { print $_."\n"}}' | sort | uniq | wc -l
WYJŚCIE7
Jeśli chcesz ignorować przełamane:
echo -e "aba\ncfg!ഡ.#g" | perl -C7 -ne 'for(split(//)){if ($_ !~ /[[email protected]#.\n]/) { print $_."\n"}}' | sort | uniq | wc -l
WYJŚCIE6
Jedna linijka w perlu + bash masz na myśli? –
@gnibbler Powiedziałem ** używając ** jednego liniowca. Masz rację, to była misfrase - napisałem, że jedna rzecz znaczy inna. Poprawiono to. Dzięki za wskazanie. –
W Pythonie:
import itertools, codecs
predicate = set('[email protected]#.').__contains__
unique_char_count = len(set(itertools.ifilterfalse(
predicate, itertools.chain.from_iterable(codecs.open(filename, encoding="UTF-8")))))
Kiedy iteracyjne nad plikiem, można uzyskać linie. chain
łączy je razem, więc powtarzając nad nim, otrzymujesz postacie. ifilterfalse
eliminuje znaki, które spełniają warunek, z warunkiem zdefiniowanym jako członkostwo w zbiorze niedozwolonych znaków.
Bez itertools:
import codecs
disallowed = set('[email protected]#.')
unique_char_count = len(set(char for line in codecs.open(filename, encoding="UTF-8") for char in line
if char not in disallowed))
Korzystanie zestaw operacji:
import codecs
unique = set()
any(unique.update(line) for line in codecs.open(filename, encoding="UTF-8"))
unique.difference_update('[email protected]#.')
unique_char_count = len(unique)
Oto rozwiązanie bash. :)
bash$ perl -CSD -ne 'BEGIN { $s{$_}++ for split //, q([email protected]#.) }
$s{$_}++ || $c++ for split //;
END { print "$c\n" }' *.utf8
"Oto rozwiązanie bash" ... NIE! ;) – paulsm4
+1 za policzek ;-) –
tchrist, jaki byłby w scenariuszu odpowiednik '-CSD'? –
będę po prostu rzucić w moim języku nie-wymagane opcją na dokładkę:
sed 's/[[email protected]#.]//g' /path/to/file | sed 's/./\0\n/g' | sort -u | wc -l
To nawet nie przychodzi * nigdzie ** zamknij *** do pracy w moim systemie dla plików UTF-8. Przed 'wc', istnieje garść linii takich jak' 0n0n0n0n', '0n0n0n0n0n0n0n0n', itd. I tak, LANG =' en_US.UTF-8'. Nie używasz standardowego POSIX-a, prawda? – tchrist
@Andrew Kandels - Myślę, że to świetne rozwiązanie. Jeśli oryginalny plik ma 16-bitowy kod Unicode, zawsze możesz użyć iconv: 'iconv -f utf-16 -t ascii plik_źródłowy | sed 's /[[email protected]#.]// g'/path/do/file | sed 's/./ \ 0 \ n/g' | sort -u | wc -l' – paulsm4
Przepraszamy, rozmieszczone w części UTF-8. dodatek @ paulsm4 powinien jednak rozwiązać ten problem. –
Wpisz zestawy w Pythonie. powiedzmy chcesz dowiedzieć się unikalne znaki w pliku url.txt
f=open('url.txt')
a=''
for x in f:
x=x.split(' ')
for y in x:
a+=y
unique=set(a)-set('@!#.') #add the characters that you wanna neglect in the second set
print(unique)
print('unique characters : ',len(unique))
powiedzmy URL.TXT zawiera:
Google --! google.com --! coolest search engine
facebook --! facebook.com --! biggest social network
yahoo --! yahoo.com --! biggest web portal
wyjściowy będzie:
{'a', 'G', 'm', '\n', 'n', 'c', 'b', 'e', 'g', 'f', 'i', 'h', 'k', '-', 'l', 'o', 'p', 's', 'r', 't', 'w', 'y'}
unique characters : 22
Moja odpowiedź już zawiera kilka wersji Pythona, które są zasadniczo takie same. Ponadto wydajność twojego konstruktora stringów jest __terrible__. Dodawanie ciągów jest powolne - jeśli musisz usunąć spacje i dołączyć do linii, powinieneś użyć czegoś takiego jak ''' .join (''. Join (x.split()) dla x w f)' które będzie znacznie szybsze . Zobacz moją odpowiedź na sposoby, aby to zrobić bez budowania długich ciągów. – agf
jednym alternatywnym:
filename='/somewhere/my-file-in-utf8'
iconv -f UTF8 -t UTF16 $filename | tail -c +3 | \
perl -pi -e "s/\x00\@//g; s/\x00\!//g; s/\x00\#//g; s/\x00\.//g;" | \
od | cut -b 8- | xargs -n 1 | sort | uniq | wc -l
zapomniałem o unikalnej części, post został naprawiony. – pizza
rubin, wykorzystujące zestawy:
require 'set'
string = 'ababbbababbabcdcccdbbaaba'
ignore = 'c'
(Set.new(string.chars) - Set.new(ignore.chars)).count
# => 3
string
jest ciąg wejściowyignore
jest ciągiem z postaciami ignorowaćstring.chars
znajduje się lista znaków w ciągSet.new
Tworzy zestaw z niego-
daje różnicę między dwoma zestawamicount
jest liczba elementów w wynikowa
'ignore.chars' wystarczy; nie trzeba go konwertować do zestawu. – steenslag
Innym rubin pierwszy:
#encoding: utf-8
string = '@étude#@étude ฒณ!'
ignore = '[email protected]#.'
p string.chars.to_a.uniq.join.delete(ignore).size #=>8
Zrobiłem to w python po 3 godzinach badań, ale zrobiłem to
fname = "temp.txt"
num_lines = 0
num_words = 0
num_chars = 0
num_uniq = 0
a = []
exclude = ",[email protected]#$"
with open(fname, 'r') as f:
for line in f:
words = line.split()
for word in words:
char = list(word)
a = a + char
num_lines += 1
num_words += len(words)
num_chars += len(line)
print "Lines:%s\nWords:%s\nChars:%s" % (num_lines, num_words, num_chars)
num_uniq = len(set(a)-set(exclude))
print "Unique Characters:%d" % (num_uniq)
tutaj jest wyjście
Lines:6
Words:74
Chars:385
Unique Characters:26
- 1. Jak policzyć liczbę znaków w DIV za pomocą javascript
- 2. Jak policzyć liczbę słów w ciągu?
- 3. policzyć liczbę połączeń klauzuli
- 4. MongoDB: jak policzyć liczbę kluczy w dokumencie?
- 5. Jak policzyć liczbę komentarzy w JIRA
- 6. jak policzyć liczbę obiektów utworzonych w C++
- 7. Jak policzyć liczbę słów w tekście (łańcuch)?
- 8. Jak policzyć liczbę słów w zdaniu?
- 9. Jak mogę policzyć liczbę JsObjects w JsValue?
- 10. Spark - Jak policzyć liczbę rekordów kluczem
- 11. Jak mogę policzyć średnią liczbę bliską 100?
- 12. Policzyć liczbę wystąpień ciągu w polu VARCHAR?
- 13. Jak policzyć liczbę obserwacji w R jak Stata liczby poleceń
- 14. Jak policzyć liczbę wierszy w tabeli bazy danych w Django
- 15. Jak mogę policzyć liczbę rekordów, które mają unikalną wartość w danym polu w ROR?
- 16. mysql SORTUJ przez liczbę unikalnych dopasowań słów
- 17. Jak liczyć liczbę wystąpień pewnego znaku w ciągu znaków?
- 18. zapytanie, aby policzyć liczbę różnych wartości?
- 19. Jak policzyć liczbę wystąpień każdego identyfikatora klucza obcego w tabeli?
- 20. W wyszukiwaniu Lucene/Lucene.net, jak policzyć liczbę uderzeń na dokument?
- 21. Jak programowo policzyć liczbę plików w archiwum przy użyciu Pythona
- 22. Jak policzyć liczbę usuniętych wierszy w zapytaniu MYSQL?
- 23. Jak policzyć liczbę wierszy z określonych danych w MSSQL
- 24. Jak policzyć liczbę liter w ciągu bez spacji?
- 25. Jak wydrukować liczbę znaków w każdym wierszu pliku tekstowego
- 26. Jak wydrukować liczbę unikalnych dopasowań za pomocą polecenia grep?
- 27. Policzyć liczbę wystąpień numeru na liście
- 28. Które polecenie w VBA może policzyć liczbę znaków w zmiennej łańcuchowej?
- 29. jak policzyć całkowitą liczbę wierszy w pliku tekstowym za pomocą Pythona
- 30. MySQL - Hrabia liczba unikalnych wartości
nie można zrobić tylko bash. Musisz napisać pełny program w bashu. W takim przypadku lepiej używać języka programowania. –
Czy istnieje jakiś szczególny powód, dla którego musisz użyć "bash"? – paulsm4
Brzmi jak praca domowa ... – fbernardo