Kirjoittaja Aihe: Toivotaan apua grep -komentoon  (Luettu 3835 kertaa)

0 jäsentä ja 1 Vieras katselee tätä aihetta.

Poissa RaijaR

  • Jäsen
  • Viestejä: 1421
  • Sukupuoli: Nainen
Toivotaan apua grep -komentoon
« : 14.08.2019 - klo:16:46 »
Ei taaskaan oikein onnistu. Olen lueskellut, ja kokeillut erilaisia kombinaatioita, mutta aina tulee sutta ja sekundaa ...  ::)
Tuon dokumentin kanssa olen kamppaillut: https://people.uta.fi/~jm58660/jutut/unix/grep.html

Tarkoitus olisi saada tämänsorttinen tulostus grep-komennolla:

2019-08-10 09:29:15 UTC Speed 50 km/h Altitude 682 meters
2019-08-10 09:44:15 UTC Speed 49 km/h Altitude 599 meters

Olisi tarkoitus raapaista tiedot tiedostosta (tietueita on kymmeniä/satoja, mutta tässä vain 2 esimerkkinä):

<Placemark>
        <name>2019-08-10 09:29:15 UTC</name>
        <description><![CDATA[Date/Time 2019-08-10 12:29:15 (UTC+3)
 Battery 100% (4184 mV)
 Solar I 13 mA
 Light 1453
 Temperature 24 °C
 Accelerometer X=268 Y=-129 Z=655
     
 GPS fix time 14440 ms
 Longitude 26.521338
 Latitude 57.568619
 Speed 50 km/h
 Altitude 682 meters
 HDOP 0.9]]></description>
        <styleUrl>#icon-1899-DB4436</styleUrl>
        <Point>
          <coordinates>
            26.521338,57.568619,682
          </coordinates>
        </Point>
      </Placemark>
      <Placemark>
        <name>2019-08-10 09:44:15 UTC</name>
        <description><![CDATA[Date/Time 2019-08-10 12:44:15 (UTC+3)
 Battery 100% (4184 mV)
 Solar I 8 mA
 Light 1582
 Temperature 22 °C
 Accelerometer X=332 Y=-102 Z=947
     
 GPS fix time 14480 ms
 Longitude 26.444529
 Latitude 57.48893
 Speed 49 km/h
 Altitude 599 meters
 HDOP 1.0]]></description>
        <styleUrl>#icon-1899-DB4436</styleUrl>
        <Point>
          <coordinates>
            26.444529,57.48893,599
          </coordinates>
        </Point>
      </Placemark>

Jos joku viitsisi ystävällisesti jonkinlaisen luurangon grep-komennosta tehdä, niin ehkä osaisin sitä modifioidakin jatkossa.

edit. korjailtu ulkoasua
« Viimeksi muokattu: 14.08.2019 - klo:16:52 kirjoittanut RaijaR »
Pöytäkone ASUS ExpertCenter PN52, Tumbleweed, jossa nippu distroja QEMU/KVM:ssä.
Ja Väinö-minibulli :D
Huom! Kirjoitusvihreet tulee jostain aravuudesta...

Poissa SuperOscar

  • Käännösryhmä
  • *
  • Viestejä: 912
  • Sukupuoli: Mies
  • Tänään täällä, huomenna poissa
    • Legisign.org
Vs: Toivotaan apua grep -komentoon
« Vastaus #1 : 14.08.2019 - klo:20:39 »
Tuo ei ole ihan helppo tehtävä, jos edes mahdollinen. grep olettaa tietueeksi riviä. Jos saman tietueen tietoja pitää metsästää useammalta riviltä, joutuu yleensä ongelmiin. Periaatteessa tietue-erotinta voi vaihtaa, mutta se ei ole välttämättä kovin yksinkertaista.

XML on sinänsä tietokantamuoto, joten sille on ihan omat työkalunsa. Tässä on kuitenkin ongelmana se, että tuo ei ole hyvinmuodostunutta XML:ää, koska yksittäinen kaikki tietueet yhteen nivova ”juuritietue” puuttuu.

Tämmöisellä Python-pätkällä tarvitsemasi tieto löytyy, mutta vain jos XML-tiedoston alkuun lisää rivin ”<data>” ja loppuun ”</data>” (missä on samantekevää, onko teksti ”data” vai jotain muuta, kunhan tämmöinen tunnistepari löytyy):

Koodia: [Valitse]
#!/usr/bin/env python3
import xml.etree.ElementTree as et
tree = et.parse('data.xml') # tähän siis tiedoston nimi
root = tree.getroot()
for mark in root.iter('Placemark'):
    time = mark.find('name').text.strip()
    desc = {k: v for k, _, v in [s.strip().partition(' ') for s in mark.find('description').text.split('\n')]}
    speed = 'Speed ' + desc['Speed']
    alt = 'Altitude ' + desc['Altitude']
    print(time, speed, alt)

Luultavasti helpoimmin tuon ongelmasi ratkaisisi AWKilla ”tilakonetta” käyttäen: aina kun jotain haluttua löytyisi, vaihdettaisiin toiseen tilaan ja haettaisiin jotain muuta jne.
pöytäkone 1, kannettavat 1–3: Debian GNU/Linux 12; pöytäkone 2: openSUSE Tumbleweed; NUC: openSUSE Leap 15.5; RPi 1: FreeBSD 13.2-RELEASE; RPi 2: LibreELEC 11

Poissa SuperOscar

  • Käännösryhmä
  • *
  • Viestejä: 912
  • Sukupuoli: Mies
  • Tänään täällä, huomenna poissa
    • Legisign.org
Vs: Toivotaan apua grep -komentoon
« Vastaus #2 : 14.08.2019 - klo:20:57 »
Jäi sen verran mietityttämään, että ratkaisin ongelman AWKillakin:

Koodia: [Valitse]
#!/usr/bin/awk -f
/<name>/ {
    if (line) {
        print line
        line = ""
    }
    gsub("</?name>", "")
    gsub("^[ ]+", "")
    line = $0
}
/^[ ]*Altitude/ {
    line = line $0
}
/^[ ]*Speed/ {
    line = line $0
}
END {
    print line
}
pöytäkone 1, kannettavat 1–3: Debian GNU/Linux 12; pöytäkone 2: openSUSE Tumbleweed; NUC: openSUSE Leap 15.5; RPi 1: FreeBSD 13.2-RELEASE; RPi 2: LibreELEC 11

Poissa RaijaR

  • Jäsen
  • Viestejä: 1421
  • Sukupuoli: Nainen
Vs: Toivotaan apua grep -komentoon
« Vastaus #3 : 15.08.2019 - klo:17:46 »
Kiitos! Meikäläinen alkaa kohtapuoliin testaamaan, että kuinkas minulta onnistuu  ;)

Tässä on vielä yksi toinen juttu työn alla. Jos siitäkin tulee sutta ja sekundaa, niin tarttee taas palata palstalaisten puoleen
Pöytäkone ASUS ExpertCenter PN52, Tumbleweed, jossa nippu distroja QEMU/KVM:ssä.
Ja Väinö-minibulli :D
Huom! Kirjoitusvihreet tulee jostain aravuudesta...

guest1912

  • Vieras
Vs: Toivotaan apua grep -komentoon
« Vastaus #4 : 17.08.2019 - klo:09:04 »
testi.txt sisältää:
"
<Placemark>
        <name>2019-08-10 09:29:15 UTC</name>
        <description><![CDATA[Date/Time 2019-08-10 12:29:15 (UTC+3)
 Battery 100% (4184 mV)
 Solar I 13 mA
 Light 1453
 Temperature 24 °C
 Accelerometer X=268 Y=-129 Z=655
     
 GPS fix time 14440 ms
 Longitude 26.521338
 Latitude 57.568619
 Speed 50 km/h
 Altitude 682 meters
 HDOP 0.9]]></description>
        <styleUrl>#icon-1899-DB4436</styleUrl>
        <Point>
          <coordinates>
            26.521338,57.568619,682
          </coordinates>
        </Point>
      </Placemark>
      <Placemark>
        <name>2019-08-10 09:44:15 UTC</name>
        <description><![CDATA[Date/Time 2019-08-10 12:44:15 (UTC+3)
 Battery 100% (4184 mV)
 Solar I 8 mA
 Light 1582
 Temperature 22 °C
 Accelerometer X=332 Y=-102 Z=947
     
 GPS fix time 14480 ms
 Longitude 26.444529
 Latitude 57.48893
 Speed 49 km/h
 Altitude 599 meters
 HDOP 1.0]]></description>
        <styleUrl>#icon-1899-DB4436</styleUrl>
        <Point>
          <coordinates>
            26.444529,57.48893,599
          </coordinates>
        </Point>
      </Placemark>
"
Tämän jälkeen voidaan grep komennolla etsiä tarvittavat rivit ja hieman sed kikkailulla siivota tesktiä ja tämän jälkeen tulostaan xargs  komennolla halutut asiat samalle riville.
grep '<name\|Speed\|Altitude' testi.txt | sed 's/<name>//' | sed 's/<\/name>//' | sed 's/^[[:space:]]\+//' | xargs -n3 -d'\n'
2019-08-10 09:29:15 UTC Speed 50 km/h  Altitude 682 meters
2019-08-10 09:44:15 UTC Speed 49 km/h  Altitude 599 meters


Poissa RaijaR

  • Jäsen
  • Viestejä: 1421
  • Sukupuoli: Nainen
Vs: Toivotaan apua grep -komentoon
« Vastaus #5 : 18.08.2019 - klo:01:16 »
Nyt on yritetty yhdellä jos toisellakin konstilla, vaan eipä vaan ota tuulta purjeisiin.
Saatta olla, että annoin väärät lähtötiedot, mutta liitteessä todellinen tiedosto.

Kyllä olen monesti kaivannut opetettavaa editoria. Tämäkin menisi varmaan parin minuutin opetuksella. Ensin kertaoisi editorille, että opi. Editoisi yhden tietueen ja kertoisi editorille, että muista. Sitten vaan toista seuraava komento opi 1000 (=tarpeeksi monta kertaa).
Pöytäkone ASUS ExpertCenter PN52, Tumbleweed, jossa nippu distroja QEMU/KVM:ssä.
Ja Väinö-minibulli :D
Huom! Kirjoitusvihreet tulee jostain aravuudesta...

guest1912

  • Vieras
Vs: Toivotaan apua grep -komentoon
« Vastaus #6 : 20.08.2019 - klo:21:20 »
Alkoi sen verran kiinnostamaan, että tein tuollaisen pienen bash scriptin, joka purkaa tiedot juuri tuohon haluttuun muotoon.

Koodia: [Valitse]
#!/usr/bin/env bash

# Siivoa terminaalista kaiken ylimääräisen pois.
clear

#Otetaan talteen bashiin tiedoston nimi.
FILE=$1

if [[ -e $FILE ]]; then
   #Etsitään speed + arvo + yksikkö
   reSpeed='(Speed)\s+([0-9]+)\s+(km\/h)'
   #Etsitään Altitude + arvo + yksikkö
   reMeters='(Altitude)\s+([0-9]+)\s+(meters)'
   
   #Grep ottaa vain sellaiset rivit, jossa on <name> ja päivämäärä, speed ja Altitude mainittu.
   Data="$(grep '<name>[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]\|Speed\|Altitude' "$FILE" )"
   #Varmistus tulostukseen ja alustetaan indeksi nollaksi.
   index=0
   #luetaan rivi kerraan, koska <name>päivämäärä</name> on omansa ja loppu datalla on omansa.
   while read -r line; do
    if [[ $line == *"name"* ]]; then
        #parseName muuttujaan tulee pelkkä päivämäärä, kun siitä on siivottu nimi osuudet pois ja otetaan kaikki tyhjät merkit alusta pois
        parseName="$( echo $line | sed 's/<name>//' | sed 's/<\/name>//' | sed 's/^[[:space:]]+//' )"
    fi    #Etsitään rivistä speed maininta.
    if [[ $line == *"Speed"* ]] ; then
        if [[ "$line" =~ $reSpeed ]]; then
            #SpeedInfo osuuteen tulee speed + arvo +yksikkö.
            speedInfo="${BASH_REMATCH[0]}"
        fi
    fi
            #Etsitään rivistä Altitude maininta.
    if  [[ $line == *"Altitude"* ]]; then
        if [[ "$line" =~ $reMeters ]]; then
           #altitudeInfo osuuteen tulee speed + arvo +yksikkö.
           altitudeInfo="${BASH_REMATCH[0]}"
           #Asetetaan indeksi muuttujan arvoksi toka, jotta tiedetään päivämäärä + speed + Altituden olevan valmis
           let index=2
        fi
    fi
    if [ $index == 2 ]; then
        #tulostetaan  päivämäärä + speed + Altituden tiedot
        echo $parseName $speedInfo $altitudeInfo
        #Asetataan indeksi muuttujan arvoksi nolla, jotta haetaan uudet tietot.
        let index=0
    fi
   done <<< "$Data"
fi
Olen vienyt tuon bash scriptin tiedostoon nimeltä dataParser.sh ja antanut sille sudo chmod u+rx dataParser.sh:lla suoritusoikeudet yms.

Tämän jälkeen voit kutsua terminaalista esimerkiksi ./dataParser.sh Aru\ 17.08.2019\ last\ data\ at\ 20.44.kml, joka tekee halutun asian mitä halusit.
Esimerkiksi tuo sinun antama tiedosto antaa tälläisen tulostuksen.

Koodia: [Valitse]
2019-08-17 11:03:43 UTC Speed 58 km/h Altitude 1123 meters
2019-08-17 11:13:45 UTC Speed 54 km/h Altitude 411 meters
2019-08-17 11:23:45 UTC Speed 56 km/h Altitude 772 meters
2019-08-17 11:33:45 UTC Speed 46 km/h Altitude 645 meters
2019-08-17 11:43:42 UTC Speed 41 km/h Altitude 786 meters
2019-08-17 11:54:10 UTC Speed 28 km/h Altitude 776 meters
2019-08-17 12:03:42 UTC Speed 35 km/h Altitude 1024 meters
2019-08-17 12:13:43 UTC Speed 82 km/h Altitude 786 meters
2019-08-17 12:23:42 UTC Speed 63 km/h Altitude 1235 meters
2019-08-17 12:33:44 UTC Speed 21 km/h Altitude 770 meters
2019-08-17 12:43:42 UTC Speed 55 km/h Altitude 1011 meters
2019-08-17 12:53:43 UTC Speed 63 km/h Altitude 437 meters
2019-08-17 13:03:42 UTC Speed 53 km/h Altitude 844 meters
2019-08-17 13:13:42 UTC Speed 52 km/h Altitude 1382 meters
2019-08-17 13:23:43 UTC Speed 59 km/h Altitude 883 meters
2019-08-17 13:33:41 UTC Speed 32 km/h Altitude 930 meters
2019-08-17 13:43:41 UTC Speed 23 km/h Altitude 765 meters
2019-08-17 13:53:41 UTC Speed 52 km/h Altitude 677 meters
2019-08-17 14:03:43 UTC Speed 49 km/h Altitude 356 meters
2019-08-17 14:13:51 UTC Speed 34 km/h Altitude 248 meters
2019-08-17 14:23:52 UTC Speed 0 km/h Altitude 149 meters
2019-08-17 14:33:49 UTC Speed 0 km/h Altitude 121 meters
2019-08-17 14:43:46 UTC Speed 0 km/h Altitude 60 meters
2019-08-17 14:53:41 UTC Speed 0 km/h Altitude 63 meters
2019-08-17 15:03:41 UTC Speed 1 km/h Altitude 63 meters
2019-08-17 15:13:42 UTC Speed 0 km/h Altitude 112 meters
2019-08-17 15:23:42 UTC Speed 0 km/h Altitude 68 meters
2019-08-17 15:33:48 UTC Speed 0 km/h Altitude 71 meters
2019-08-17 15:43:41 UTC Speed 0 km/h Altitude 63 meters
2019-08-17 15:53:42 UTC Speed 0 km/h Altitude 72 meters
2019-08-17 16:03:42 UTC Speed 0 km/h Altitude 81 meters
2019-08-17 16:13:43 UTC Speed 0 km/h Altitude 66 meters
2019-08-17 16:23:42 UTC Speed 0 km/h Altitude 65 meters
2019-08-17 16:33:43 UTC Speed 0 km/h Altitude 40 meters
2019-08-17 16:43:43 UTC Speed 0 km/h Altitude 51 meters
2019-08-17 16:53:43 UTC Speed 0 km/h Altitude 55 meters
2019-08-17 17:04:10 UTC Speed 0 km/h Altitude 41 meters
2019-08-17 17:13:40 UTC Speed 0 km/h Altitude 29 meters
2019-08-17 17:23:41 UTC Speed 0 km/h Altitude 37 meters
2019-08-17 17:33:40 UTC Speed 0 km/h Altitude 42 meters
2019-08-17 17:43:42 UTC Speed 0 km/h Altitude 43 meters
2019-08-17 17:53:41 UTC Speed 0 km/h Altitude 36 meters

Koodia saa käyttää vapaasti ja muokata, jos haluaa.


Poissa RaijaR

  • Jäsen
  • Viestejä: 1421
  • Sukupuoli: Nainen
Vs: Toivotaan apua grep -komentoon
« Vastaus #7 : 20.08.2019 - klo:21:49 »
Kiitos Suk!
Nyt toimii hyvin ja sain saman listan kuin sinä (ja mikä, etten olisi saanut, kun oli valmis skripti)  :D

Mulla on mennyt tämä päivä siihen, että olen saanut poltettua tekstit (srt-tiedosto) elokuvaan. En olisi välttämättä sitä tarvinnnt, mutta kun en oikein osaa luovuttaa, koska tiedän, että se on mahdollista  :P

Pöytäkone ASUS ExpertCenter PN52, Tumbleweed, jossa nippu distroja QEMU/KVM:ssä.
Ja Väinö-minibulli :D
Huom! Kirjoitusvihreet tulee jostain aravuudesta...