Skip to content

Instantly share code, notes, and snippets.

@libricoleur
Created October 11, 2012 18:46
Show Gist options
  • Save libricoleur/3874653 to your computer and use it in GitHub Desktop.
Save libricoleur/3874653 to your computer and use it in GitHub Desktop.
Premier script AWK : la base de données musicale
# Conclusion de l'exercice : on peut aussi écrire des trucs crades en AWK.
# Fonctions
## Affiche la liste des albums de l'artiste depuis la variable globale 'artist_albums'
function print_artist_albums(){
for (album in artist_albums){
print " <album name=\""artist_albums[album]["name"]"\">"
for (support in artist_albums[album]["supports"]){
print " <support id=\""artist_albums[album]["supports"][support]["id"]\
"\" type=\""artist_albums[album]["supports"][support]["type"]\
"\" prix=\""artist_albums[album]["supports"][support]["prix"]"\"/>"
}
print " </album>"
}
}
## Termine une balise <style>, et une <groupe> si nécessaire
function end_style(){
if (opened["groupe"]) {
print_artist_albums()
print " </groupe>"
opened["groupe"]=0
}
if (opened["style"]) print "</style>"
}
#
BEGIN {
FS=": "
print "<xml>"
}
END {
# Il faut fermer le dernier <style> à la fin du fichier
end_style()
print "</xml>"
}
/^*$/ {
# On se sert des lignes "*" pour comprendre qu'on a fini un <style>.
# Ça aurait aussi pu aller dans le bloc /^STYLE/, avec un if
# (opened["style"]).
end_style()
opened["style"]=0
}
/^STYLE/ {
print "<style name=\""$2"\">"
opened["style"]=1
}
/^GROUPE/ {
# Dès qu'on passe à un nouveau groupe, on affiche les albums du précédent
if (opened["groupe"]){
print_artist_albums()
print " </groupe>"
#(inutile) opened["groupe"] = 0
}
print " <groupe name=\""$2"\">"
opened["groupe"]=1
# On vide la liste des albums du groupe précédent
delete artist_albums
}
/^ALBUM/ {
for (n=2; n<=NF; n++) {
# On stocke le nom de chaque album
artist_albums[n-2]["name"]=$n
}
}
/^SUPPORT/ {
# Pour chaque album
for (n=2; n<=NF; n++) {
split($n, sups, "; ")
supn=0
# et pour chaque support de l'album
for (sup in sups) {
# on stocke le type du support et le chiffre qui va avec (ID ?)
split(sups[sup], sup_obj, "=")
artist_albums[n-2]["supports"][supn]["type"]=sup_obj[1]
artist_albums[n-2]["supports"][supn]["id"]=sup_obj[2]
supn++
}
}
}
/^PRIX/ {
# Même principe que pour /^SUPPORT/.
for (n=2; n<=NF; n++) {
split($n, prix, "; ")
supn=0
for (pri in prix) {
artist_albums[n-2]["supports"][supn]["prix"]=prix[pri]
supn++
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment