Aika sekunneista - awk

Kryil 01.06.05 18:20

Muuntaa sekunteina saadun ajan ihmisen luettavaan muotoon

 Tekstiversio  Arvo: 1 (3 ääntä)  Äänestä: +  -
Kun tämä nyt on niin suosittu aihe...

Kirjoittelin tällaisen joskus harjoitellessani awk:ta, ja samalla tutoriaaliksi.
Tallenna tiedostoon, (itse käytin nimeä times), aja chmod +x times
Tai vaihtoehtoisesti awk -f times

------------------
#!/bin/gawk -f

# Käyttö: times [-v multi=1] [-v pos=N] [-v short=1] [<tiedosto>]
# Esim: times -v multi=1 -v short=1 /proc/uptime
# muuttuja multi on boolean, oletuksena parsitaan vain ensimmäinen.
# Jos multi on tosi, parsitaan jokainen arvo jokaiselta riviltä.
# muuttuja pos ottaa arvokseen numeron, jota käytetään valitsemaan sarake
# jokaiselta riviltä. Jos multi on tosi, pos ignoroidaan.
# muuttuja short ottaa käyttöön lyhyet yksiköt.
# HUOM: Me emme tulosta kuukausia, edes matemaattista standardimittaista
# sellaista. Tulos on tarkempi näin.

# Asetetaan muuttujat vain kerran.
# BEGIN-blokki ajetaan vain kerran, ennen kuin aletaan leikkimään riveillä
BEGIN {
        # split("string", muuttuja, [erottaja]);
        # Kivaa kun ei piitata kakkaakaan tietotyypeistä
        # HUOM: voisimme hyödytää strtonum-funktiota, mutta yhteensopivuus
        # kärsisi siitäkin. Olisi parasta, jos nämä asettaisi arrayhun käsin.
        split("31536000 604800 86400 3600 60 1", units);

        # 1=monikko, 2=yksikkö. Loogista? :)
        split("vuotta viikkoa päivää tuntia minuuttia sekuntia", names1);
        split("vuosi viikko päivä tunti minuutti sekunti", names2);

        # Ja sortsit. ;)
        split("y w d h m s", shorts);
}

# Joka kerta ajettava scripti.
{
        # Tarkistetaan mitä tehdään.
        if (multi) split($0, times);
        else if (pos > 0) {
                split($0, temppi);
                times[0] = temppi[pos];
        } else times[0] = $1;

        # Ja sitten lasketaan.
        for (x in times) {
                for (i=1;i<=6;i++) {
                        if (times[x] >= units[i]) {
                                temp = times[x] / units[i];
                                printf "%d", temp;
                                if (short) {
                                        printf "%s ", shorts[i];
                                } else {
                                        if (int(temp) == 1) printf " %s ", names2[i];
                                        else printf " %s ", names1[i];
                                }
                                times[x] %= units[i];
                        }
                }
                printf "\n";
        }
}