staging.inyokaproject.org

Häufigkeit von Uhrzeit auswerten

Status: Ungelöst | Ubuntu-Version: Ubuntu 16.04 (Xenial Xerus)
Antworten |

AnorLondo

Anmeldungsdatum:
7. Mai 2020

Beiträge: 1

Es geht darum die häufigste Uhrzeit zu finden, zu der Artikel veröffentlicht wurden.

https://www.heise.de/newsticker/archiv/2013/06

habe jetzt das datetime raugesfiltert mit grep "datetime" und versucht mit cut -f2 -d "T" und cut -f1 -d "+" nur die Uhrzeit zu bekommen. Wie zähle ich jetzt die einzelnen Uhrzeiten und wie bekomme ich sie gezählt mit (uniq -c | wc -l) ?

Wie bekomme ich die anderen Zeilen weg?

Beispielteil:

18:14:00
    meta-datetime
  <span class="meta-datetime__time ">
15:50:00
    meta-datetime
  <span class="meta-datetime__time ">
13:37:00
    meta-datetime
  <span class="meta-datetime__time ">

Bearbeitet von sebix:

Bitte verwende in Zukunft Codeblöcke, um die Übersicht im Forum zu verbessern!

sebix Team-Icon

Ehemalige

Anmeldungsdatum:
14. April 2009

Beiträge: 5584

Quick & dirty: grep -v datetime dranhaengen. Besser: die initiale Suche (Regex) verfeinern.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

AnorLondo schrieb:

Wie bekomme ich die anderen Zeilen weg?

Das ist IMHO die falsche Frage - HTML mit zeilenbasiert arbeitenden Tools zu parsen ist verdammt fehlerträchtig - warum nimmst du nicht einen ordentlichen HTML-Parser - z.B. mit den Paketen python3-requests und python3-bs4?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/env python3
from collections import Counter
from datetime import datetime
import requests
from bs4 import BeautifulSoup

request = requests.get('https://www.heise.de/newsticker/archiv/2013/06')
request.raise_for_status()

soup = BeautifulSoup(request.text, 'html.parser')

publish_times = []
for t in soup.find_all('time'):
    dt = datetime.strptime(t['datetime'], "%Y-%m-%dT%H:%M:%S%z")
    publish_times.append(dt.strftime("%H:%M"))

c = Counter(publish_times)
for time, frequency in c.most_common(1):
    print(time, frequency)
$ python3 heise_newsticker_most_comon.py
10:00 22 

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

Mit dem Extrahieren ist es ja auch nicht getan. Wie genau sollen denn die Urzeiten sein? Wenn Du minutengenau erfasst, dann sind das 1440 Zeitpunkte, mit Sekunden sogar 86400. Ich würde ja eher annehmen, dass man auf fünf oder 15 Minuten rundet. Dann macht sich das besser mit einer Skriptsprache:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/ruby

require 'time'

ROUND = 60 * 15

counts = Hash.new 0

ARGF.each_line do |line|
  if %r{^((?:\d{1,2}:){2}\d{1,2})} =~ line
    t = Time.parse $1
    s = t - t.to_i % ROUND
    counts[s.strftime '%H:%M'] += 1
  end
end

counts.sort_by {|t, c| -c}.each do |t, c|
  printf "%5s %10d\n", t, c
end

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

Mit

1
egrep "[0-9][0-9]:[0-9][0-9]:[0-9][0-9]" DATEI

solltest Du die Zeiten filtern können. Die eckigen Klammern [] kennzeichnen Zeichenklassen, hier Zeichen von 0 bis 9, also Ziffern. Das könnte man noch einschränken, um enger auf Zeiten zu matchen, aber das ist oft überflüssig, gerade bei generischen Daten, die immer gleich formatiert sind.

Zum Zählen mit uniq müssen die Zeiten meiner Erinnerung zufolge sortiert sein:

1
egrep "[0-9][0-9]:[0-9][0-9]:[0-9][0-9]" DATEI | sort | uniq -c 

Oh, datetime kenne ich noch gar nicht!

1
grep -v datetime DATEI | sort | uniq -c 

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

user_unknown schrieb:

Oh, datetime kenne ich noch gar nicht!

1
grep -v datetime DATEI | sort | uniq -c 

grep -v AUSDRUCK lässt einfach alle Zeilen weg, in denen der Ausdruck vorkommt. Das geht solange gut, bis sich jemand entscheidet das HTML anders zu formatieren, so dass es nicht mehr ausreicht Zeilen, in denen datetime vorkommt zu filtern...

Den Text zwischen den Tag-Elementen zu parsen halte ich für die schlechtere Alternative, wenn man schon einen eindeutigen Timestamp als datetime-Attribut aus den Tags der originalen Daten bekommen kann (Zeilenumbrüche bei Attributen mit nur einem Wert sind sehr selten)...

<time
  datetime="2013-06-30T18:14:00+02:00"
  itemprop="datePublished"
  class="
    meta-datetime
    a-article-teaser__preceded-kicker archive__article-teaser-preceded-kicker"
>

  <span class="meta-datetime__time ">
    18:14
  </span>
</time>
1
2
3
curl -s https://www.heise.de/newsticker/archiv/2013/06 | \
  grep -Po '(?<=datetime="\d{4}-\d\d-\d\dT)\d\d:\d\d(?=:\d\d\+\d\d:\d\d")' | \
  sort | uniq -c | sort -nr | head -n 5

sollte sowas liefern:

     22 10:00
     10 12:00
      6 19:10
      6 12:55
      5 15:15

PS: egrep und fgrep sind schon aus POSIX entfernt worden, da sollte man sich gleich grep -E bzw. grep -F angewöhnen, wenn man das neu lernt.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

seahawk1986 schrieb:

PS: egrep und fgrep sind schon aus POSIX entfernt worden, da sollte man sich gleich grep -E bzw. grep -F angewöhnen, wenn man das neu lernt.

Skandal! Die gefallen mir aber besser als die Varianten mit der Großbuchstabenoption.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

seahawk1986 schrieb:

user_unknown schrieb:

Oh, datetime kenne ich noch gar nicht!

1
grep -v datetime DATEI | sort | uniq -c 

grep -v AUSDRUCK lässt einfach alle Zeilen weg, in denen der Ausdruck vorkommt.

Uhm! Irgendwas kam mir doch komisch vor, eigentlich kenne ich den Schalter -v und nutze ihn auch dauernd, aber der Fehlschluss, hier könnte sich was getan haben und ein Platzhalter für Datetimes aller Art dazugekommen war zu verlockend. ☺ Ich dachte, bevor ich das nachschlage, schnell mal ausprobieren, und durch die Verkettung zweier Fehler, nämlich nicht beachtend, dass da literal "datetime" in den zu unterdrückenden Zeilen steht, fühlte ich mich bestätigt. ☺

Das geht solange gut, bis sich jemand entscheidet das HTML anders zu formatieren, so dass es nicht mehr ausreicht Zeilen, in denen datetime vorkommt zu filtern...

Ja, und dann sieht man merkwürdige Ergebnisse und prüft es nach und passt es an. Ich hatte ja den Zeitfilter mit "[0-9][0-9]:[0-9][0-9]:[0-9][0-9]" nicht gelöscht.

PS: egrep und fgrep sind schon aus POSIX entfernt worden, da sollte man sich gleich grep -E bzw. grep -F angewöhnen, wenn man das neu lernt.

Und wer interessiert sich für POSIX? Mir kommt es so vor, als sei von egrep schon 1998 abgeraten worden.

1
2
3
4
5
wasmacht egrep
egrep Typ ist Datei oder unbekannt: file
/bin/egrep: POSIX shell script, ASCII text executable
#!/bin/sh
exec grep -E "$@"

Das wasmacht ist übrigens auch nicht POSIX. Das egrep tippt sich einfach besser ohne Leerzeichen, Blank und Shift. Ich kann jedem nur raten das eigene Wohlempfinden beim Skripten nicht zu kurz kommen zu lassen und andererseits die heiligen Kühe nicht in den Himmel wachsen zu lassen. 😉

Antworten |