bashawkgawk

parse the output of mkvinfo in bash with gawk


I'm using the code described on this thread to parse mkvinfo output

Bash script to extract information from a block of text spanning multiple lines

my data:

+ Pistes du segment
| + Une piste
|  + Numéro de piste : 1 (identifiant de piste pour mkvmerge & mkvextract : 0)
|  + UID de piste : 2143402115
|  + Type de piste : video
|  + Marque de laçage : 0
|  + Identifiant du codec : V_MPEG4/ISO/AVC
|  + Données de codec privées, longueur 50 (profil h.264 : High @L3.1)
|  + Durée par défaut : 41.708 ms (23.976 images/champs par seconde pour une piste vidéo)
|  + Marque par défaut : 1
|  + Cache minimum : 1
|  + Piste vidéo
|   + Largeur (pixels) : 1280
|   + Hauteur (pixels) : 530
|   + Largeur à l'écran : 1278
|   + Hauteur à l'écran : 530
| + Une piste
|  + Numéro de piste : 2 (identifiant de piste pour mkvmerge & mkvextract : 1)
|  + UID de piste : 1488372266
|  + Type de piste : audio
|  + Marque de laçage : 0
|  + Identifiant du codec : A_AAC
|  + Données de codec privées, longueur 2
|  + Langue : fre
|  + Marque par défaut : 1
|  + Audio track
|   + Fréquence d'échantillonnage : 48000
|   + Canaux : 2
| + Une piste
|  + Numéro de piste : 3 (identifiant de piste pour mkvmerge & mkvextract : 2)
|  + UID de piste : 1313701432
|  + Type de piste : audio
|  + Marque de laçage : 0
|  + Identifiant du codec : A_AAC
|  + Données de codec privées, longueur 2
|  + Langue : eng
|  + Marque par défaut : 0
|  + Audio track
|   + Fréquence d'échantillonnage : 48000
|   + Canaux : 2
| + Une piste
|  + Numéro de piste : 4 (identifiant de piste pour mkvmerge & mkvextract : 3)
|  + UID de piste : 1052586390
|  + Type de piste : subtitles
|  + Marque de laçage : 0
|  + Identifiant du codec : S_HDMV/PGS
|  + Langue : fre
|  + Marque par défaut : 0
| + Une piste
|  + Numéro de piste : 5 (identifiant de piste pour mkvmerge & mkvextract : 4)
|  + UID de piste : 392408513
|  + Type de piste : subtitles
|  + Marque de laçage : 0
|  + Identifiant du codec : S_HDMV/PGS
|  + Langue : fre
|  + Marque par défaut : 0
| + Une piste
|  + Numéro de piste : 6 (identifiant de piste pour mkvmerge & mkvextract : 5)
|  + UID de piste : 1184974912
|  + Type de piste : subtitles
|  + Marque de laçage : 0
|  + Identifiant du codec : S_HDMV/PGS
|  + Langue : eng
|  + Marque par défaut : 0
| + Une piste
|  + Numéro de piste : 7 (identifiant de piste pour mkvmerge & mkvextract : 6)
|  + UID de piste : 2028534438
|  + Type de piste : subtitles
|  + Marque de laçage : 0
|  + Identifiant du codec : S_HDMV/PGS
|  + Langue : eng
|  + Marque par défaut : 0
| + Une piste
|  + Numéro de piste : 8 (identifiant de piste pour mkvmerge & mkvextract : 7)
|  + UID de piste : 1986046695
|  + Type de piste : subtitles
|  + Marque de laçage : 0
|  + Identifiant du codec : S_HDMV/PGS
|  + Langue : eng
|  + Marque par défaut : 0
|+ Cluster

I want to store in var the language of subtitles available and in another var the audio language available.

This code work fine for subtitles:

mkvinfo "$tmdb_file" | gawk '
match($0, /Numéro de piste : ([0-9]+)/, m) {TN=m[1]}
match($0, /Langue : ([a-z]+)/, m)        {CI=m[1]}
/Type de piste : subtitles/                {SUB=1}
/^\| \+ Une piste$/ {if(SUB) print TN, CI; unset SUB}
END               {if(SUB) print TN, CI; unset SUB}'

But this code for audio return also subtitles track

mkvinfo "$tmdb_file" | gawk '
match($0, /Numéro de piste : ([0-9]+)/, m) {TN=m[1]}
match($0, /Langue : ([a-z]+)/, m)        {CI=m[1]}
/Type de piste : audio/                {SUB=1}
/^\| \+ Une piste$/ {if(SUB) print TN, CI; unset SUB}
END               {if(SUB) print TN, CI; unset SUB}'

thanks for your help


Solution

  • The problem you are seeing is because of the

    unset SUB

    line used in the body of the awk command. It is NOT a awk built-in, but a shell built-in to reset the variable value.

    The unset builtin command

    The unset builtin command is used to unset values and attributes of shell variables and functions. Without any option, unset tries to unset a variable first, then a function.

    So for your Awk just reset the variable with initializing it to zero as SUB=0,

    mkvinfo "$tmdb_file" | gawk '
       match($0, /Numéro de piste : ([0-9]+)/, m) {TN=m[1]} \
       match($0, /Langue : ([a-z]+)/, m)          {CI=m[1]} \
       /Type de piste : audio/                     {SUB=1} \
       /^\| \+ Une piste$/ {if(SUB) print TN, CI; SUB=0;} \
       END {if(SUB) print TN, CI; SUB=0}' 
    

    which produces output as

    2 fre
    3 eng