Ich möchte wissen, welches Wort in einer Zeile doppelt vorkommt und wie oft es in einer Datei vorkommt

Ich möchte wissen, welches Wort in einer Zeile doppelt vorkommt und wie oft es in einer Datei vorkommt

Beispiel: Ich habe eine Datei a.txt, die Folgendes enthält:

aunt bear bear true

Ich habe auch eine Datei b.txt, die Folgendes enthält:

tru tru high

das Endergebnis, das ich möchte, ist:

for a.txt : bear x 2
for b.txt : tru x 2

Mir fällt bisher nur folgendes ein:

cut -d ' ' -f1 file.txt | sort | uniq -c | head -1

Ich habe keine Ideen mehr

Die Sortierung muss auf die Dateien angewendet werden; Klarstellung: Bei der Einführung der Dateien c.txt b.txt y.txt sollte der Inhalt von b zuerst und der Inhalt von y zuletzt kommen

Antwort1

Hier ist ein einfacher, schneller Ansatz, der für beliebige Dateinamen und Dateiinhalte funktionieren sollte:

$ for file in a.txt b.txt ; do 
    printf 'for %s : %s\n' "$file" "$(tr ' ' '\n' < "$file" | sort | uniq -dc)"; 
  done
for a.txt :       2 bear
for b.txt :       2 tru

Oder, wenn Sie wirklich brauchengenaudas Format, das Sie anzeigen:

$ for file in a.txt b.txt ; do 
    printf 'for %s : %s x %s\n' "$file" \
        $(tr ' ' '\n' < "$file" | sort | uniq -dc | awk '{print $2,$1}');
  done
for a.txt : bear x 2
for b.txt : tru x 2

Antwort2

$ for i in $(cat a.txt); do echo $i; done | sort | uniq -c | sort -g | tail -1
      2 bear

Skript:

$ cat topword.sh
#!/bin/bash

FILENAMES=$@

for file in $@; do
    printf "$file:"
    cat $file | tr ' ' '\n' | sort | uniq -c | sort -g | tail -1
done

Ausgabe:

$ bash topword.sh a.txt b.txt
a.txt:      2 bear
b.txt:      2 tru

Jetzt habe ich eine Aufgabe für Sie: Machen Sie aus dem Entwurf, den ich Ihnen gegeben habe, ein ansprechendes und leicht lesbares Skript ;)

Antwort3

Ein einfacher awk-Befehl wird hier den Zauber vollbringen

Erster Schritt, da wir berechnen müssen, wie oft ein bestimmtes Wort in einer Datei vorkommt

Schritt 1: Erstellen einer neuen Eingabedatei basierend auf der Eingabedatei

cat input file |sed -r "s/\s+/\n/g" >inputfile_final.txt

Schritt 2: Jetzt wird ein einfacher Awk-Befehl mit zugehörigem Array Wunder wirken

awk '{a[$1]++}END{for(x in a){print FILENAME, x,a[x]}}' inputfile_final.txt | sort -k3 -nr| sed -n '1p'| awk '{print "for" " " $1 " " ":" $2 " " "x" " "  $NF}'

Ausgabe

for inputfile_final.txt :bear x 2


Note: I have done for 1 file same method we can follow for remaining files too

verwandte Informationen