it-swarm-eu.dev

Získejte textový soubor Počet výskytů slov všech slov a tiskový výstup seřazený

Měl jsem příkaz, který by pracoval v textovém souboru, spočítal všechny výskyty slov a vytiskl jej takto:

[email protected] $˜ 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

Nehledá tedy řádek po řádku, ale slovo Word, a to pro všechna slova, nejen pro 1 slovo. Našel jsem to někde na internetu už dávno, ale nemůžu to najít ani si ho pamatovat.

29
user2909

Použil bych tr místo awk :

echo "Lorem ipsum dolor sit sit amet et cetera." | tr '[:space:]' '[\n*]' | grep -v "^\s*$" | sort | uniq -c | sort -bnr
  • tr pouze nahradí mezery novými řádky
  • grep -v "^\s*$" ořízne prázdné řádky
  • sort připravit se jako vstup pro uniq
  • uniq -c pro počítání výskytů
  • sort -bnr seřadí v číselném obráceném pořadí a ignoruje mezeru

wow. ukázalo se, že je to skvělý příkaz spočítat přísahat na řádek

najít. -name "* .py" -exec cat {} \; | tr '[: mezera:]' '[\ n *]' | grep -v "^\s * $" | řazení | uniq -c | sort -bnr | grep kurva

34
seler
  1. Rozdělte vstup na slova, jedno na řádek.
  2. Seřadit výsledný seznam slov (řádků).
  3. Squash více výskytů.
  4. Seřadit podle počtu výskytů.

Chcete-li rozdělit vstup na slova, nahraďte libovolný znak, který považujete za oddělovač Word, za nový řádek.

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

Nepoužíváte grep a awk, ale zdá se, že to, co chcete:

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
5
Bram

Věřím, že jste po něčem takovém?

$ 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

samozřejmě můžete udělat totéž s awk také :)

2
amitkr

Použitím awk/sort/uniq řešení:

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

třídí vzestupně po rozdělení souboru na slova.

Jednoduchý grep najde fish v fisheye, takže musíte vylepšit příkaz grep, abyste zabránili částečným shodám.

Trvá asi 3 s pro textový soubor o velikosti 25 000 na stroji ve věku, klasický HDD (IDE).

Pro větší soubory nebo často prováděné operace by byl lepší přístup k hashovým mapám, ale pro zřídka spuštěnou úlohu nebo pouze pro menší soubory by to mohlo stačit.

0
user unknown