用 gawk 解析 bash 中 mkvinfo 的输出

parse the output of mkvinfo in bash with gawk

我正在使用此线程中描述的代码来解析 mkvinfo 输出

我的数据:

+ 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

我想在 var 中存储可用的字幕语言,在另一个 var 中存储可用的音频语言。

此代码适用于字幕:

mkvinfo "$tmdb_file" | gawk '
match([=12=], /Numéro de piste : ([0-9]+)/, m) {TN=m[1]}
match([=12=], /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}'

但是这个音频代码return也有字幕轨道

mkvinfo "$tmdb_file" | gawk '
match([=13=], /Numéro de piste : ([0-9]+)/, m) {TN=m[1]}
match([=13=], /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}'

感谢您的帮助

您遇到的问题是因为

unset SUB

行在 awk 命令的正文中使用。它是 NOT 一个 awk 内置,而是一个 shell 内置来重置变量值。

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.

因此,对于您的 Awk,只需重置变量并将其初始化为零,如 SUB=0

mkvinfo "$tmdb_file" | gawk '
   match([=10=], /Numéro de piste : ([0-9]+)/, m) {TN=m[1]} \
   match([=10=], /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}' 

产生的输出为

2 fre
3 eng