Forum » Programiranje » Izpis z awk med več vzorci (patterni)
Izpis z awk med več vzorci (patterni)
poweroff ::
Imam Markdown datoteke z naslednjo vsebino
V bashu bi rad izpisal zadevo tako, da bo ven padla CSV (tab delimited) datoteka s strukturo:
Opcija je tudi:
Z awk znam narediti izpis med dvema patternoma. Kaj pa med več dvojicami patternov?
--- title: Naslov besedila date: 2020-01-01T00:00:00+00:00 author: Ime Avtorja layout: default permalink: /blah/blah/ categories: - Prva - Morda tudi druga tags: - prvi - drugi - morda tretji --- Besedilo, besedilo, besedilo, besedilo,...
V bashu bi rad izpisal zadevo tako, da bo ven padla CSV (tab delimited) datoteka s strukturo:
Naslov besedila \t Besedilo, besedilo, besedilo, besedilo,...
Opcija je tudi:
Naslov besedila \t 2020-01-01T00:00:00+00:00 \t Besedilo, besedilo, besedilo, besedilo,...
Z awk znam narediti izpis med dvema patternoma. Kaj pa med več dvojicami patternov?
sudo poweroff
Spura ::
Tuki se ti zna zgodit da bos velik vec cajta porabu za to v bashu napisat, kot pa v cem drugem.
Ce bi rad napisal z awk in znas matchat eno vrednost ne pa dveh, ti predlagam, da preprosto pozenes veckrat cez file. Najprej pozenes cez file in poberes vse naslove besedila v en temp file. Potem pozenes cez isti file awk in poberes vsa besedila. Pol pa oba temp fajla skombiniras in das tab med vrednosti. Lahko pozenes se tretjic pa poberes vse datume.
Ce bi rad napisal z awk in znas matchat eno vrednost ne pa dveh, ti predlagam, da preprosto pozenes veckrat cez file. Najprej pozenes cez file in poberes vse naslove besedila v en temp file. Potem pozenes cez isti file awk in poberes vsa besedila. Pol pa oba temp fajla skombiniras in das tab med vrednosti. Lahko pozenes se tretjic pa poberes vse datume.
Zgodovina sprememb…
- spremenil: Spura ()
sas084 ::
Probi si napisat "state machine" awk skripto, recimo kot primer:
Skripta je napisana na pamet in sigurno ne dela za vse kombinacije inputa, služi le kot primer.
#!/usr/bin/awk -f # # 'begin' blok - izvede se 1x # BEGIN { inside_mark = 0; skip_print = 0; } # # zacetka/konca bloka # /^---$/ { if (inside_mark) { inside_mark = 0; skip_print = 1; } else { inside_mark = 1; } } # # vzorec 'title' # /^title\:/ { if (inside_mark) { printf "%s\t\t", substr($0, 8) } } # # ustreza vsem vzorcem # { if (!inside_mark && !skip_print) { printf "%s", $0 } if (skip_print) { skip_print = 0; } } # # 'end' blok, izvede se 1x # END { }
Skripta je napisana na pamet in sigurno ne dela za vse kombinacije inputa, služi le kot primer.
poweroff ::
Imaš prav. Python to the rescue.
Zelo na hitro spisana koda (gotovo se da še ful optimizirat, glede na to, da ne znam programirati)
Potem pa v bashu rečem:
...pa pade ven tab-delimited CSV datoteka.
Zelo na hitro spisana koda (gotovo se da še ful optimizirat, glede na to, da ne znam programirati)
#!/usr/bin/python3 import re import sys from pathlib import Path def cleanhtml(raw_html): cleanr = re.compile('<.*?>|&([a-z0-9]+|#[0-9]{1,6}|#x[0-9a-f]{1,6});') cleantext = re.sub(cleanr, '', raw_html) return cleantext filename = sys.argv[1] txt = Path(filename).read_text() txt = txt.split("\n",1)[1] txt = txt.replace('\n', ' ') txt = txt.replace('\t', ' ') txt = txt.replace('*', '') txt = cleanhtml(txt) txt = txt.replace('\.', ' \.') txt = ' '.join(txt.split()) naslov = re.search('title: (.*)date:', txt) vsebina = re.search('--- (.*)', txt) print(naslov.group(1).strip() + "\t" + vsebina.group(1).strip())
Potem pa v bashu rečem:
for f in *.md; do python3 pretvori.py $f >> clanki.csv; done
...pa pade ven tab-delimited CSV datoteka.
sudo poweroff
Spura ::
Fora je k si najprej zbrisal newlines pa podobno, da potem si prisiljen met regex kot je 'title: (.*)date:', ce bi pa najprej razparceliral podatke pa potem pucal vn posebne znake bi lahko lepo po vrsticah matchal. Zdej pa ce se ti zgodi, da `date:` manjka, ti tudi titlea ne bo matchal. Plus, seveda, z regexi tezko odstranis vse posebne znake, recimo dal si vn * za bold, ampak _ in __ pa ostanejo notri (so tudi markdown). Pa HTML espace sekvence si odstranil ampak to lahko pomeni da bodo manjkal znaki.
Meni ne smeta uporabljat knjiznjic in bi lepo pretvoru markdown v html, potem pa bi vse feedal v html parser, in potem iz rezultata obdrzal samo stringe.
Meni ne smeta uporabljat knjiznjic in bi lepo pretvoru markdown v html, potem pa bi vse feedal v html parser, in potem iz rezultata obdrzal samo stringe.
poweroff ::
Ja, se strinjam, je precej neumno narejeno. Ampak za moj namen deluje (datuma v bistvu ne rabim).
sudo poweroff
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Slo-Tech userscriptsOddelek: Izdelava spletišč | 5173 (2625) | jype |
» | Bash skriptaOddelek: Programiranje | 3241 (2553) | poweroff |
» | Unicode decodeOddelek: Programiranje | 1960 (1418) | Randomness |
» | BashOddelek: Programiranje | 2306 (1702) | keworkian |
» | Javascript in zunanja datotekaOddelek: Izdelava spletišč | 875 (723) | hamax |