Sıralanan tüm kelimelerin metin-dosya kelime sayımlarını al


28

Bir metin dosyasında çalışacak, kelimelerin tüm oluşumlarını sayacak ve şöyle yazdıracak bir komutu vardı:

user@box $˜ magic-command-i-forgot | with grep | and awk | sort ./textfile.txt
66: the
54: and
32: I
16: unix
12: bash
5:  internet
3:  sh
1: GNU/Linux

Bu yüzden satır satır arama yapmaz, tek tek kelime eder ve sadece 1 kelime için değil, tüm kelimeler için yapar. Uzun zaman önce internette bir yerde bulmuştum, ama bulamıyorum veya hatırlayamıyorum.

Yanıtlar:


33

Awktr yerine kullanırım :

echo "Lorem ipsum dolor sit sit amet et cetera." | tr '[:space:]' '[\n*]' | grep -v "^\s*$" | sort | uniq -c | sort -bnr
  • tr sadece boşlukları yenileri ile değiştirir
  • grep -v "^\s*$" boş satırları keser
  • sort girdi olarak hazırlamak uniq
  • uniq -c olayları saymak
  • sort -bnr boşlukları yok sayarak sayısal ters sırada sıralar

vay. satır başına yemin saymak için harika bir komut olduğu ortaya çıktı

Bul -adı "* .py" -exec cat {} \; | tr '[: space:]' '[\ n *]' | grep -v "^ \ s * $" | sıralama | uniq -c | sort -bnr | grep fuck


tr -sÖzellikle, girintiyle karşılaştığınızda, birden çok alanı işlemek için kullanmak isteyebilirsiniz .
Arcege

@Arcege: İyi nokta. Sonucu değiştirmemesine rağmen, senaryoyu biraz sabitleyebilir.
seler

-g( --general-numeric-sort) seçeneği sortbazı durumlarda tercih edilebilir. Örneğin sort -ntutacak 10\n1 4tedavi, gibidir 1 4kadar 14süre sort -golarak doğru bir şekilde ele alacağız 1 4\n10.
Skippy le Grand Gourou

güzel komut, gerçekten bir oy hakkı hak :)
Noor

@ scher grep ve tr kısmını aşağıdaki gibi daha da basitleştirebileceğinizi düşünüyorum: echo "Lorem ipsum dolor sit sit amet et cetera." | tr ' ' '\n' | grep -v "^$" | sort | uniq -c | sort -bnrYeni başlayan biri olduğumu, bu yüzden yanlış olabileceğimi, lütfen tavsiye vermekten çekinmeyin.
smc

8
  1. Girişi, her satıra bir tane olmak üzere kelimelere bölün.
  2. Sonuçta ortaya çıkan sözcüklerin listesini (satırlar) sıralayın.
  3. Squash çoklu oluşumları.
  4. Oluşum sayısına göre sırala.

Girişi sözcüklere ayırmak için sözcük ayırıcı olarak kabul ettiğiniz herhangi bir karakteri yeni satır ile değiştirin.

<input_file \
tr -sc '[:alpha:]' '[\n*]' | # Add digits, -, ', ... if you consider
                             # them word constituents
sort |
uniq -c |
sort -nr

Bu güzel bir cevaptır, çünkü kelimelerin, görmezden gelmek istediğiniz sözcük olmayan noktalama işaretlerinin hemen yanında olduğu durumun üstesinden gelebilir.
David Grayson

5

Grep ve awk kullanmamak, ancak bu istediğinizi yapar:

for w in `cat maxwell.txt`; do echo $w; done|sort|uniq -c
  2 a
  1 A
  1 an
  1 command
  1 considered
  1 domain-specific
  1 for
  1 interpreter,
  2 is
  1 language.
  1 line
  1 of

1
Girdi kabuk joker karakterler içeriyorsa (eklemeniz gerekir set -f) ve noktalama işaretlerini kelimelerin bir parçası olarak görürse (bu, IFSASCII olmayan karakter kümelerini desteklemeye çalışırken iyi şanslar) noktalama karakterlerini ekleyerek sıkıntıyla düzeltilebilir ). Bu, tüm dosyayı bellekte sakladığı için ( sortdaha zeki) çok büyük giriş dosyalarıyla iyi olmaz .
Gilles 'SO- kötülük'

2

Bunun gibi bir şeyin peşinde olduğuna inanıyorum?

$ perl -n -e 'foreach ${k} (split(/\s+/)){++$h{$k}};END{foreach $l (keys(%h)){print "$h{$l}: ${l}\n"}}' /path/to/your/file | sort -n -k 1

Tabii ki de aynı şeyi yapabilirsiniz awk:)


2

awk/sort/uniqÇözüm kullanarak :

awk '{for(w=1;w<=NF;w++) print $w}' ~/textFile.txt | sort | uniq -c | sort -nr

Güzel! Bu kusursuz çalıştı.
stidmatt

0
file=/home/stefan/ooxml1.txt
for word in $(sed 's/[^A-Za-z]/ /g' $file | tr " " "\n" | sort -u)
do
  echo -n "$word "
  grep -c $word $file
done | sort -k2 -n 

dosyayı sözcüklere ayırdıktan sonra artan sayıyı sıralar.

Basit grep bulacaksınız fishiçinde fisheyekısmi eşleşmeleri önlemek için grep komutunu artırmak zorunda.

Klasik HDD (IDE), bir makinede 25k metin dosyası için yaklaşık 3s alır.

Daha büyük dosyalar veya sıklıkla gerçekleştirilen işlemler için bir karma harita yaklaşımı daha iyi olurdu, ancak nadiren çalışan bir iş veya sadece daha küçük dosyalar için yeterli olabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.