Aika sekunneista - awkMuuntaa sekunteina saadun ajan ihmisen luettavaan muotoon 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";
}
}
|
  Haku

|