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
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 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