
Ich muss am Ende jeder Zeile die Anzahl der übereinstimmenden Zeichenfolgen ausdrucken.
Ein Beispiel für den Abgleich foo
:
foo,bar,foo,foo
bar,foo,bar,bar
foo,foo,bar,bar
Ergebnis :
foo,bar,foo,foo,3
bar,foo,bar,bar,1
foo,foo,bar,bar,2
Ich habe diesen Link überprüft (Wie zählt man die Anzahl eines bestimmten Zeichens in jeder Zeile?), aber kein Glück.
Antwort1
Wir können awk mit gsub verwenden, um die Anzahl der Vorkommen zu erhalten.
awk '{print $0","gsub(/foo/,"")}' file
Ausgabe:
foo,bar,foo,foo,3
bar,foo,bar,bar,1
foo,foo,bar,bar,2
Antwort2
Vielleicht mit einer Mischung aus bash
undgrep
$ while read -r line; do
echo -n "$line -> "
grep -o foo <<<"$line" | wc -l
done < /path/to/my-input-file
foo,bar,foo,foo -> 3
bar,foo,bar,bar -> 1
foo,foo,bar,bar -> 2
Antwort3
Falls jemand auch etwas in Python möchte. Geben Sie den Dateinamen und das magische Wort an, über das gezählt werden soll.
#!/usr/bin/python3
# magic_word_count.py
# Takes a filename and magic word and prints the number of times the word
# appears on each line of the file.
#
# ./magic_word_count.py myfile.txt foo
#
import sys
filename = sys.argv[1]
magic_word = sys.argv[2]
with open(filename, 'r') as f:
for line in f.readlines():
words = line.strip().split(',')
print(len([word for word in words if word == magic_word]))
Verwendung:
$ cat myfile.txt
foo,bar,foo,foo
bar,foo,bar,bar
foo,foo,bar,bar
$ ./magic_word_count.py myfile.txt foo
3
1
2
Antwort4
Unter Verwendung awk
und Annahme, dass die Eingabe eine „einfache“ CSV-Datei ist (keine eingebetteten Kommas oder Zeilenumbrüche):
awk -v string="foo" -F, '
BEGIN { OFS = FS }
{
sum = 0
for (i = 1; i <= NF; ++i) sum += $i == string
$(NF+1) = sum
}; 1' file
Dies nimmt die Zeichenfolge, deren Vorkommen wir zählen möchten, und durchläuft dann die Felder jedes Datensatzes, wobei genaue Übereinstimmungen gezählt werden. Die kumulierte Summe der übereinstimmenden Felder wird dann als neues Feld am Ende des Datensatzes hinzugefügt und der Datensatz wird gedruckt.