Szkriptek: Python, Perl, Bash, ...

MEGOLDVA - leszámlálás

Van egy olyan fájlom, amelynek egy-egy sorában egy-egy (maximum ötjegyű) szám áll. A számok nemcsökkenő sorrendben következnek egymás után.
Tudtok javasolni olyan módszert, amellyel az előforduló számok darabszámát könnyen le tudom kérdezni? Valami uniq/wc/? kombinációra gondolok.
Pl. ilyen fájl esetén:
508
508
508
508
1104
1104
1104
1105
Ilyen megoldásra vágyom:
508: 4
1104: 3
1105: 1

csak megadott karakter elfogadása

Ha egy kérdésre csak 2 válasz lehetséges: (i/n), és nem szeretnénk ha a szkript tovább menne amíg rossz karaktert nyomnak. Pld. d vagy 5
Erre létezik egyszerűbb megoldás ennél?


#!/bin/bash

answer_control() {
case ${answer} in
i) error=0 ;;
n) error=0 ;;
*) error=1 ;;
esac
}

# vagy

answer_control() {
if [ "$answer" = "i" -o "$answer" = "n" ]; then
error="0"
else error="1"
fi
}

# vagy rövidebben

answer_control() {
if ! [ "$answer" = "i" -o "$answer" = "n" ]; then
error="1"
fi
}

error_level() {
if [ ${error} -eq 0 ]; then
break
else printf "HIBA \n"
fi
}

while true; do
error="0"
printf "Megmondod a neved? (i/n) "
read answer || break
answer_control
error_level
done
echo "Név: ${answer}"

Azért vannak szubrutinban, mert mi van ha több kérdés is van, amelyre szintén csak ezt a két karaktert lehet elfogadni.
S mi van ha 1/2/3 a választási lehetőség?

Regexp karakter csere zárójelre

Sziasztok!
Egy következő regexp kifejezést keresek:
van egy ibm 852 kódolású text fájlban egy ilyen kifejezés:
szóköz##NAGYBETŰS_SZÓSZÁM##szóköz
NAGYBETŰS_SZÓSZÁM esetében nem biztos hogy igaz, hogy van aláhúzásjel és szám.
A kezdő és végző ## karaktereket kellene francia idézőjelekre cserélnem. Milyen regexp kifejezéssel tudnám ezeket megtaláni (ja és ezt jedit alatt szeretném majd leginkább, ha lehet, csinálnék rá valamilyen makrót)

[Megoldva] fájltörlés scriptből

Fájltörlést szeretnék végrahajtani scriptből, de nem egyszerű számomra a művelet.
Ugyanis nem a létrehozási dátum a mérvadó, hanem ami fájlnévben szerepel.

Pld. Blabla_AT_2010-nov-25_10-25.ext

A Blabla változhat, az ext meg a kiterjesztés, és az is változhat.
Leszeretném törölni szkript segítségével az aktuális dátumnál 1 nappal régebbi DÁTUM NEVŰ fájlokat, függetlenül attól hogy azok mikor keletkeztek.
Emiatt nem jöhet szóba az mtime
find ${dir}/ -name "*AT*.sh" -mtime +1 -exec echo rm -f {} \; -print
Milyen ötletek vannak?

dupla számjegy

Eljutottam odáig, hogy egy lekérdezés, ellenőrzést is végez. A probléma ott van hogy a 06 helyett elfogadja a 6-ot is amit viszont nem kéne. Csakis nn formában kellene elfogadnia az adatokat.
Mi hiányzik? Már fáradt vagyok.


#!/bin/bash

number_control() {
regex="^[0-9][0-9]*$"
if [[ ${control} =~ ${regex} && $((10#${control})) -ge ${start} && $((10#${control})) -le ${end} ]]; then
if [[ ! -z ${control} ]]; then
# control="$((10#${control}))"
control="${control}"
fi
else error="1"
fi
}

seven_day() {
regex="^[1-7]{1}$|^[1-7]{1}-[1-7]{1}$|^\*$"
match_HN=$(echo "${HN}" | egrep ${regex})
if [ $? -eq 0 ];then
if [ ${#match_HN} -ne 1 ]; then
from="${match_HN:0:1}"; to="${match_HN:2:1}"
if [ ${to} -le ${from} ]; then
error="1"
fi
fi
else error="1"
fi
}

error_level() {
if [ ${error} -eq 0 ]; then
printf "Minden adat jó. \n"
break
else printf "HIBA \n"
fi
}

clear
while true; do
error="0"
printf "Add meg az adatokat szóközzel! (HH NN ÓÓ PP): "
read HH NN OO PP || break
start="1"; end="12"; control="${HH}"; number_control; HH="${control}" # month_control
start="1"; end="31"; control="${NN}"; number_control; NN="${control}" # day_control
start="0"; end="23"; control="${OO}"; number_control; OO="${control}" # hour_control
start="0"; end="59"; control="${PP}"; number_control; PP="${control}" # minute_control
error_level
done

echo HH - $HH
echo NN - $NN
echo OO - $OO
echo PP - $PP

cron, fájltörlés, automatizmus

Egy script letudja magát törölni?

A gondom a következő: Adott egy interaktív script, mely egy másik scriptet (fájlt) készít és ezt beteszi a CRON-ba is.
(dátum, útvonal/script)
Ha lefutott, akkor az elkészült scriptre már nincs szükség, de a cron bejegyzésre sem.

Tudom hogy CRON helyett egyszeri feladatra lehetne használni pld. az at-t is, de azt egyszerűen nem tudom lekezelni. (Egyelőre)
A crontab-ot megtudom nézni a crontab -l-lel. Utólag is tudom módosítani ha a szükség úgy hozza a crontab -e-vel.
Az at-t hogyan?
De akár így, akár úgy, a lefutott scriptre (fájlra) már nem lesz szükség. Előny hogy a dátum benne van a fájlnévben.

Akkor még egyszer két dolog érdekelne:
A lefutott cron bejegyzések, illetve a lefutott scriptek eltávolítása.
Ha a cron helyett mást kéne használni, az sem gond de a man at elég kevés infót ad nekem.

De a cron bejegyzés eltávolítása akkor is érdekes, ha pld. rendszeresen csak két hónapig van a scriptre szükség, utána már nem.
Bár elég nehezen behatárolható hogy meddig van az adott scriptre szükség.
De az biztos ha már nem kell, akár le is törölhetem. Ekkor kéne egy automata megoldás, ami ezután kitörli a crontab-ból is a bejegyzést.
Megoldható ez?

Problémák a geany és zen coding páros beüzemelésével

Megpróbáltam beállítani Geany-hez a Zen coding nevezetű csodát, először ksgy blogbejegyzése szerint, aztán improvizálva. Az első nekifutásra nem találta a BeautifulSoup-ot és a zen_core-t, hibaüzenetben pedig írta, hogy a /var/mail-ben keresi őket. Gondoltam innentől eltérek a leírástól és bemásolom oda, hátha... A helyzet annyi, hogy mostmár egy pár sorral lejjebb áll meg, mégpedig ott, hogy:

def expandAbbr(abbr, doc_type='html', profile_name='plain'):

A hibaüzenet pedig:

00:10:51: Adatátadás és egyedi parancs végrehajtása: /home/fodorbalazs/g/zencoding.py
00:10:57: A futtatott egyedi parancs sikertelenséget jelző hibakóddal állt le.
00:10:58: A futtatott egyedi parancs hibát adott vissza. A kijelölt részlet nem került megváltoztatásra. Hibaüzenet: /home/fodorbalazs/g/zencoding.py: 7: Syntax error: "(" unexpected

Mit ronthattam el? :-S
A Geany a karmicban lakó 0.18-as, BeautifulSoup 3.0.8, a zencoding meg... ami a googlecode-on van fent legfrissebb.

Perl szkript AFP fájl darabolására

Adott egy .afp fájl (Advanced Function Presentation - http://en.wikipedia.org/wiki/Advanced_Function_Presentation, pl. ez is ilyen: http://web2.osb.hu/z/a.afp ). Ebben szöveges és grafikus adatok is szerepelhetnek. Szeretném ezt a fájlt parancssori eszközökkel feldarabolni egy adott karakterlánc mentén (és újabb .afp vagy .pdf vagy bármilyen kép fájlokként megkapni). Létezik a CPAN-ban a Parse::AFP Perl modul (igen szegényes a dokumentációval). A mellékelt fájlok között van egy ígéretes afpslit.pl is. (Ezzel a Parse::AFP modullal állítottam elő a fenti a.afp-ből az alábbi dump-ot: http://web2.osb.hu/z/a.html ; a "Transparent Data" részeknél vannak normál szövegek, pl "functionally".)

Szeretném feldarabolni pl. a fenti a.afp fájlt négy fájllá a (dump szerint háromszor előforduló) functionally szó mentén.

minta számolás - regexp

Jó lenne egy olyan lista, hogy egy adott karakterből (vagy mintából) egy fájl soraiban mennyi van.

Tehát mondjuk olyan sor, amiben 1 db van: 20, olyan sor, amiben két darab van: 9, olyan sor, amiben 3 db van: 42...

mondjuk fogalmam sincs, egy ilyesmit hogy lehetne hatékonyan leírni. Máshonnan indult a dolog, csak tovább gondoltam egy problémát.

Kellett pl. hány sor van, amiben 76 tabulátor van. Erre írtam ezt:
egrep "(.* ){76}" Detail~.txt | wc -l

Szóval ez jó, de most azon kívül más nem jut eszembe, hogy pl. egy ciklussal végigmegyek 1-100 ig, és kiíratom melyik számúból mennyi van. Ráadásul ugye ahol 75-öt találok, az megszámolja azokat is, ahol 76 is megvan.

Esetleg egy ciklussal végigmenni fentről, és a fájlból kitörölni amit egyszer már megszámoltam...

De akkor honnan indulnék? Jobb lenne lentről indulni, amiben legalább egy van, az menjen egy temp fájlba.
Második futásra már ezt nézi, amiben legalább kettő van, menjen egy második fájlba... stb, amíg üres fájl nem lesz a vége

No, gondolom, ennél bizonyára van szebb megoldás is.