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