Aktuelles Alter anhand Geburtsdatum ausgeben.

K

Karlhans

Jungspund
Hallo,

ich habe eine Bash 3.1.17 auf einem Linux 2.6.20 mit den GNU Tools.

Ich habe eine Namensliste die ist so aufgebaut:

Code:
Hanswurst 20 06 1955
Karlheinz 01 10 1980
Franzmueller 31 12 1975
Helmuthelm 15 02 1985

Das erste Wort ist der Name, das zweite der Geburtstag, dritte der Geburtsmonat und das Vierte das Geburtsjahr. Also "Name TT MM JJ". Ich moechte nun eine Ausgabe erzeugen wie:

Code:
Hanswurst 51
Karlheinz 26
.
.

Also Name und aktuelles Alter in Jahren.

Ich denke seit drei Stunden ueber das Problem nach, mir will aber nichts wirkliches einfallen.
.
.
.
EDIT (autom. Beitragszusammenführung) :
.

Hat sich vermutlich erledigt, ich kann mir ja mit "date" das aktuelle datum holen und dann etwas mit "bc" rechnen und mit einer "if" Schleife eine Fallunterscheidung durchfuehren ob der Geburtstag dieses Jahr schon war oder noch ansteht.

Vielen Dank fuers Lesen, ich musste einfach mal das Problem sauber aufschreiben und durchlesen. :))
 
Zuletzt bearbeitet:
Code:
#!/bin/bash

#!/bin/bash

# aufgabe 1, nur ausgeben vom Alter
while read line; do
    set -- $line
    echo $1 $(( $(date "+%Y") - $4 ))
    done < foo

# Anzeigen ob schon bday gefeiert oder nicht oder heute
while read line; do
    set -- $line;
    tag=$(date "+%d")
    monat=$(date "+%m")
    if [[ $2 < $tag && $3 < $monat ]]; then
        echo "$1 hatte schon am $2 $3 Geburstag"
    elif [[ $tag = $2 && $monat = $3 ]]; then
        echo "$1 hat _heute_ Geburtstag"
    else
        echo "$1 hat noch dieses Jahr Geburstag ($2 $3)"
    fi
    done < foo
BC ist unnötig geht mit SH/Bash. See my code. :)

Zeit zum Schreiben: 1min 53s, also nicht wundern wenns nicht schön aussieht, aber es geht zumindest:

stephan@unimatrix ~ $ ./date.sh
Hanswurst 52
Karlheinz 27
Franzmueller 32
Helmuthelm 22
Hanswurst hat noch dieses Jahr Geburstag (20 06)
Karlheinz hat noch dieses Jahr Geburstag (01 10)
Franzmueller hat noch dieses Jahr Geburstag (31 12)
Helmuthelm hatte schon am 15 02 Geburstag
 
Zuletzt bearbeitet:
smg: Da ist nur ein Fehler, Karlheinz ist 26 Jahre alt :devil:

Code:
#!/bin/sh

IFS="
"

for i in `cat daten` ; do 

name=(`echo $i | awk '{print $1}'`)
gtag=(`echo $i | awk '{print $2}'`)
gmonat=(`echo $i | awk '{print $3}'`)
gjahr=(`echo $i | awk '{print $4}'`)

atag=(`date '+%d'`)
amonat=(`date '+%m'`)
ajahr=(`date '+%Y'`)

djahr=(`echo "$ajahr - $gjahr" | bc`)


if [ "$gmonat" -lt "$amonat" ] ; 
	then echo "$name $djahr" ; 
	else 	if [ "$gmonat" -eq "$amonat" -a "$gtag" -le "$atag" ] ;
			then echo $name $djahr ;
			else echo $name `echo $djahr - 1 | bc` ;
		fi ;
fi 
done

Meins sieht aber auch nicht besser aus, funktioniert aber richtig :D
 
Ja wie gesagt, bc ist unnötig und deine cat Befehle auch. Wieso nimmst du keine Shell Arithmetik? Awk brauchst du auch garnicht. Durch dieses ganze Zeug wird das ziemlich lahm. Ich verbessere mein Script nacher noch.
 
Zuletzt bearbeitet:
Brauchst es fuer mich nicht zu verbessern. Ansonsten schaue ich es mir gerne an, ich bin noch in der "Anfangslernphase" was bash betrifft. :)

Ich verwende bc weil ich es sonst auch nutze um umfangreiche Messreihen auszuwerten, daher kenne ich mich damit einigermassen aus.
 
Zurück
Oben