Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Doublets cartes/sorties

6 réponses
Avatar
Pierre ESTREM
Bonsoir,

Je tente des tests de profiles de cartes son et j'ai besoin de les
stocker sous forme de tableau comme ceci :

carte1 sortie1
carte1 sortie2
carte1 sortie3
carte2 sortie1
carte2 sortie2
carte3 sortie1

Je fais ceci :

pacmd list-cards | sed -n 's/^\tname: <\(.*\)>$/\1/p;
s/^\t\+output:\([^:]\+\).*$/\1/p'

Ainsi je n'ai pas les paires "cartes/sorties" mais tout est en ligne...

Avec des boucles je ne m'en sors pas et j'ai une peur de awk.

Quelqu'en saurait-il faire cela ?

Merci !!!

pierre estrem

6 réponses

Avatar
Étienne Mollier
--f2QGlHpHGjS2mn6Y
Content-Type: text/plain; charset=utf-8
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable
Pierre ESTREM, on 2020-03-22 23:34:28 +0100:
Je tente des tests de profiles de cartes son et j'ai besoin de les stocker
sous forme de tableau comme ceci :
carte1 sortie1
carte1 sortie2
carte1 sortie3
carte2 sortie1
carte2 sortie2
carte3 sortie1
Je fais ceci :
pacmd list-cards | sed -n 's/^tname: <(.*)>$/1/p;
s/^t+output:([^:]+).*$/1/p'
Ainsi je n'ai pas les paires "cartes/sorties" mais tout est en ligne...
Avec des boucles je ne m'en sors pas et j'ai une peur de awk.
Quelqu'en saurait-il faire cela ?

Bonsoir,
Je suppose que c'est possible de faire plus simple. Mais avec
du code awk malheureusement j'ai ceci, qui m'a l'air de produire
une sortie comme vous semblez espérer l'obtenir :
pacmd list-cards
| awk '
/^tname: <.*>$/ {
split($0, name, "<|>");
}
/^t+output:/ {
split($0, output, ":");
printf "%-31s %-sn", name[2], output[2]
}'
Le premier match enregistre le nom de la carte dans le second
champ deux du tableau name. Le second match extrait chaque
sorties son dans le champ deux du tableau output, puis affiche
ladite sortie, préfixée du nom de la carte. Ça devrait bien
marcher tant que "name:" apparait en premier, et que le nom de
la carte ne contient pas de chevrons.
Amicalement,
--
Étienne Mollier
Fingerprint: 5ab1 4edf 63bb ccff 8b54 2fa9 59da 56fe fff3 882d
Et Hip, Hip, Hip, Hourra ! Pour le personnel infirmier ! o/
--f2QGlHpHGjS2mn6Y
Content-Type: application/pgp-signature; name="signature.asc"
-----BEGIN PGP SIGNATURE-----
iQGzBAABCgAdFiEEiWj4FzqNZS4rFmXPZAyZDOTALZsFAl55EhgACgkQZAyZDOTA
LZtanAv/Slt1dgs6RjBwkRZuvdktH4/bsN1nPHEYlYUo79CMRygYd7ASoDHnCIs/
UlYrEDpRRfjLb2FIb1+5mOFPOc3CSngpMpzrZ+e0VDW0zfTnXAtM/sDkadW16haS
T9ywqa9/35uuNNfSjHd7QhYXi4gCd7bo9L/JkEcho8fIhg77YxEPsrVZ8AU2x3zu
YgKMrBoToeI/lBB3TvGOHaJywoRJPQmRdFCCKM8FrqvUH8sPVMa+K+5dzpm4tKj2
v6+/kxWHI41QDkIodfxqcFVRUEzwUGK8FX43Y27IxiuSuH/jKhS/AVFwonoeNOt/
eK+ZGBhG7S6q0lRQDYod1KjcbyN/TFObw6gojFvfRMncocgenWeIYMMJaA5Qd5zs
+p2wOXaIQabOFldmE3NNTIHNi0riVdO14oGqJEPCFepJqEINYUnfd/kTZuuPzjjB
vGvYsdQPZN/ISU9sEo/Yw993FNZo2l+6Ai78R4zcw3M/EegZbG4v2LeblecLb+Cf
EhVdAsgk
=YEkh
-----END PGP SIGNATURE-----
--f2QGlHpHGjS2mn6Y--
Avatar
Pierre ESTREM
Bonsoir Etienne et le monde libre...
Aïe, il y a des chevrons qui encadrent le nom des cartes.
J'ai des erreurs avec ton code, mais je vous remercie de votre
participation.
J'ai une horreur de 'awk' (c'est ma faute).
J'ai avancé avec la solution sed mais je dois passer ensuite par des
boucles for.
A suivre
pierre estrem
Le 23/03/2020 à 20:46, Étienne Mollier a écrit :
Pierre ESTREM, on 2020-03-22 23:34:28 +0100:
Je tente des tests de profiles de cartes son et j'ai besoin de les stocker
sous forme de tableau comme ceci :
carte1 sortie1
carte1 sortie2
carte1 sortie3
carte2 sortie1
carte2 sortie2
carte3 sortie1
Je fais ceci :
pacmd list-cards | sed -n 's/^tname: <(.*)>$/1/p;
s/^t+output:([^:]+).*$/1/p'
Ainsi je n'ai pas les paires "cartes/sorties" mais tout est en ligne...
Avec des boucles je ne m'en sors pas et j'ai une peur de awk.
Quelqu'en saurait-il faire cela ?

Bonsoir,
Je suppose que c'est possible de faire plus simple. Mais avec
du code awk malheureusement j'ai ceci, qui m'a l'air de produire
une sortie comme vous semblez espérer l'obtenir :
pacmd list-cards
| awk '
/^tname: <.*>$/ {
split($0, name, "<|>");
}
/^t+output:/ {
split($0, output, ":");
printf "%-31s %-sn", name[2], output[2]
}'
Le premier match enregistre le nom de la carte dans le second
champ deux du tableau name. Le second match extrait chaque
sorties son dans le champ deux du tableau output, puis affiche
ladite sortie, préfixée du nom de la carte. Ça devrait bien
marcher tant que "name:" apparait en premier, et que le nom de
la carte ne contient pas de chevrons.
Amicalement,
Avatar
Étienne Mollier
--hHWLQfXTYDoKhP50
Content-Type: text/plain; charset=utf-8
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable
Pierre ESTREM, on 2020-03-23 22:15:20 +0100:
Aïe, il y a des chevrons qui encadrent le nom des cartes.
J'ai des erreurs avec ton code, mais je vous remercie de votre
participation.

Quelles erreurs se produisent exactement ?
Et sur quelle version de Debian ?
J'ai vérifié avec ma configuration de cartes son et j'obtiens la
sortie suivante chez moi, indépendemment de l'implémentation de
Awk (mawk vs gawk vs busybox) :
alsa_card.pci-0000_01_00.1 hdmi-stereo
alsa_card.pci-0000_00_14.2 analog-stereo
alsa_card.pci-0000_00_14.2 analog-stereo+input
alsa_card.pci-0000_00_14.2 analog-surround-21
alsa_card.pci-0000_00_14.2 analog-surround-21+input
alsa_card.pci-0000_00_14.2 analog-surround-40
alsa_card.pci-0000_00_14.2 analog-surround-40+input
alsa_card.pci-0000_00_14.2 analog-surround-41
alsa_card.pci-0000_00_14.2 analog-surround-41+input
alsa_card.pci-0000_00_14.2 analog-surround-50
alsa_card.pci-0000_00_14.2 analog-surround-50+input
alsa_card.pci-0000_00_14.2 analog-surround-51
alsa_card.pci-0000_00_14.2 analog-surround-51+input
alsa_card.pci-0000_00_14.2 analog-surround-71
alsa_card.pci-0000_00_14.2 analog-surround-71+input
alsa_card.pci-0000_00_14.2 iec958-stereo
alsa_card.pci-0000_00_14.2 iec958-stereo+input
alsa_card.pci-0000_00_14.2 iec958-ac3-surround-51
alsa_card.pci-0000_00_14.2 iec958-ac3-surround-51+input
alsa_card.platform-pcspkr mono-fallback
alsa_card.platform-pcspkr multichannel-output
Mais peut-être que j'ai mal compris le problème ? Avec une
correction mineure sur le premier split pour régler une bonne
fois pour toute cette histoire de chevrons, et en mode « one
liner épique », je propose :
pacmd list-cards | awk '/^tname: <.*>$/{split($0,n,"^tname: <|>$");}/^t +output:/{split($0,o,":");printf "%-31s %-sn",n[2],o[2]}'
Peut-être que j'ai eu la mauvaise idée de tester sur Sid, et que
les autres versions de Debian se comportent différement ?
J'ai une horreur de 'awk' (c'est ma faute).
J'ai avancé avec la solution sed mais je dois passer ensuite par des boucles
for.

J'ai du mal à me représenter de solution simple en sed ou en
shell ; mais j'imagine que c'est possible. Si vous y parvenez,
alors je serais curieux de la voir. N'hésitez pas à la poster !
Amicalement,
--
Étienne Mollier
Fingerprint: 5ab1 4edf 63bb ccff 8b54 2fa9 59da 56fe fff3 882d
Et Hip, Hip, Hip, Hourra ! Pour le personnel infirmier ! o/
--hHWLQfXTYDoKhP50
Content-Type: application/pgp-signature; name="signature.asc"
-----BEGIN PGP SIGNATURE-----
iQGzBAABCgAdFiEEiWj4FzqNZS4rFmXPZAyZDOTALZsFAl55NegACgkQZAyZDOTA
LZsKSwv9EHXjLghmm9rl2fJwecRPNyP3EAMkOKchIINebg48j870+8LXKRbrv/5W
F8uooUiyZawbZmwjsjCEH+8WQ3qHuhhZgGtM1vD3ZJn4Zje1tLXQmfuZSSOwCu52
Gypd70tCRDSkO0V/13GkUUEQPRw8oSFmlxeFCHjVajljNPUDPOxSRAWfzXHnj3DX
jV4AnWmeNsR/VqoNe5eeOJmiR22KqCi/dKACxnUO0ZcnMw/BWglSFekgTFLfkNnp
O6cW4120uMbimFE6Ql8S1Dfa8HsuQKya2TjGo3m672oNZaki42jYdq4fBzzk1ObA
55U+YiYYW6aEGQTGF+Tx3xFotN6EjDgJZ5vD6FDBaW+eRZbZoFPC8wdi2dkSwwnY
dp0nzvChl1uQnQwVZCHHVlLmVWHBpCqDw7nOZ/eySxMRsijKJSypNH6k3Ztae8zG
DZk8w8/sbLuq9hFnKZ+Pxc3Dam2RCgqdunbaz4bvrzbFBOUUuXaLJvpgrIhy4emc
eZPUT7Ld
=tGVc
-----END PGP SIGNATURE-----
--hHWLQfXTYDoKhP50--
Avatar
Pierre ESTREM
Bonsoir,
pacmd list-cards | awk '/^tname: <.*>$/{split($0,n,"^tname:

<|>$");}/^t+output:/{split($0,o,":");printf "%-31s %-sn",n[2],o[2]}'
J'utilise une base Debian Jessie et très exactement AccessDV Linux
puisque je suis DV (déficient visuel).
Le code dessus fonctionne et me renvoie un beau tableau.
Je dois creuser car il me semble qu'il manque 1 ou 2 sorties.
Ca renvoie :
alsa_card.pci-0000_00_03.0      hdmi-stereo
alsa_card.pci-0000_00_03.0      hdmi-surround
alsa_card.pci-0000_00_03.0      hdmi-stereo-extra1
alsa_card.pci-0000_00_03.0      hdmi-surround-extra1
alsa_card.pci-0000_00_03.0      hdmi-stereo-extra2
alsa_card.pci-0000_00_03.0      hdmi-surround-extra2
alsa_card.pci-0000_00_1b.0      analog-stereo
alsa_card.pci-0000_00_1b.0      analog-stereo+input
J'ai progressé dans mon code sed et for ; je posterai !
Merci
pierre estrem
Avatar
Pierre ESTREM
Bonsoir,
C'est OK avec sed et 2 for :
#!/bin/bash
tab=(`pacmd list-cards | sed -n 's/^tname: <(.*)>$/1/p;
s/^t+output:([^:]+).*$/    1/p'`)
#### Nombre d'éléments du tableau tab
Dim=${#tab[@]}
#### Première boucle cherchant le nom d'une carte
for ((i=0; i<$Dim ; i++))
do
    #### Nom de la carte
    card=${tab[i]}
    #### Deuxième boucle cherchant les sorties de la carte
    for ((j=$[i+1] ; j<$Dim ; j++))
    do
    if [ ! "`echo ${tab[j]} | grep '_card.'`" ]; then
        output="${tab[j]}"
        echo "$card    $output"
    else break;
    fi
    done
    i=j
done
Votre code renvoie le même tableau ; je n'ai que 8 sorties alors qu'il
m'avait semblé en avoir 1 ou 2 de plus.
Les résultats sont identiques.
Je peux attaquer le test des profiles.
Merci pour votre aide :)
pierre estrem
Le 23/03/2020 à 23:19, Étienne Mollier a écrit :
Pierre ESTREM, on 2020-03-23 22:15:20 +0100:
Aïe, il y a des chevrons qui encadrent le nom des cartes.
J'ai des erreurs avec ton code, mais je vous remercie de votre
participation.

Quelles erreurs se produisent exactement ?
Et sur quelle version de Debian ?
J'ai vérifié avec ma configuration de cartes son et j'obtiens la
sortie suivante chez moi, indépendemment de l'implémentation de
Awk (mawk vs gawk vs busybox) :
alsa_card.pci-0000_01_00.1 hdmi-stereo
alsa_card.pci-0000_00_14.2 analog-stereo
alsa_card.pci-0000_00_14.2 analog-stereo+input
alsa_card.pci-0000_00_14.2 analog-surround-21
alsa_card.pci-0000_00_14.2 analog-surround-21+input
alsa_card.pci-0000_00_14.2 analog-surround-40
alsa_card.pci-0000_00_14.2 analog-surround-40+input
alsa_card.pci-0000_00_14.2 analog-surround-41
alsa_card.pci-0000_00_14.2 analog-surround-41+input
alsa_card.pci-0000_00_14.2 analog-surround-50
alsa_card.pci-0000_00_14.2 analog-surround-50+input
alsa_card.pci-0000_00_14.2 analog-surround-51
alsa_card.pci-0000_00_14.2 analog-surround-51+input
alsa_card.pci-0000_00_14.2 analog-surround-71
alsa_card.pci-0000_00_14.2 analog-surround-71+input
alsa_card.pci-0000_00_14.2 iec958-stereo
alsa_card.pci-0000_00_14.2 iec958-stereo+input
alsa_card.pci-0000_00_14.2 iec958-ac3-surround-51
alsa_card.pci-0000_00_14.2 iec958-ac3-surround-51+input
alsa_card.platform-pcspkr mono-fallback
alsa_card.platform-pcspkr multichannel-output
Mais peut-être que j'ai mal compris le problème ? Avec une
correction mineure sur le premier split pour régler une bonne
fois pour toute cette histoire de chevrons, et en mode « one
liner épique », je propose :
pacmd list-cards | awk '/^tname: <.*>$/{split($0,n,"^tname: <|>$");}/^t+output:/{split($0,o,":");printf "%-31s %-sn",n[2],o[2]}'
Peut-être que j'ai eu la mauvaise idée de tester sur Sid, et que
les autres versions de Debian se comportent différement ?
J'ai une horreur de 'awk' (c'est ma faute).
J'ai avancé avec la solution sed mais je dois passer ensuite par des boucles
for.

J'ai du mal à me représenter de solution simple en sed ou en
shell ; mais j'imagine que c'est possible. Si vous y parvenez,
alors je serais curieux de la voir. N'hésitez pas à la poster !
Amicalement,
Avatar
Étienne Mollier
--lrZ03NoBR/3+SXJZ
Content-Type: text/plain; charset=utf-8
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable
Pierre ESTREM, on 2020-03-24 04:23:52 +0100:
#!/bin/bash
tab=(`pacmd list-cards | sed -n 's/^tname: <(.*)>$/1/p;
s/^t+output:([^:]+).*$/    1/p'`)
#### Nombre d'éléments du tableau tab
Dim=${#tab[@]}
#### Première boucle cherchant le nom d'une carte
for ((i=0; i<$Dim ; i++))
do
    #### Nom de la carte
    card=${tab[i]}
    #### Deuxième boucle cherchant les sorties de la carte
    for ((j=$[i+1] ; j<$Dim ; j++))
    do
    if [ ! "`echo ${tab[j]} | grep '_card.'`" ]; then
        output="${tab[j]}"
        echo "$card    $outp ut"
    else break;
    fi
    done
    i=j
done

Bonsoir,
Merci pour le script. Je me suis permis de le relire.
Peut-être que ce n'est qu'une erreur de transcription,
mais pour avoir la même sortie, j'ai dû remplacer votre i=j
à l'avant dernière ligne, par i=$[j-1]
Votre code renvoie le même tableau ; je n'ai que 8 sorties alors qu' il
m'avait semblé en avoir 1 ou 2 de plus.

Sans la correction, votre script me sort deux lignes de moins.
C'est peut-être l'origine de la confusion ?
Les résultats sont identiques.
Je peux attaquer le test des profiles.
Merci pour votre aide :)

Ravi d'avoir pu vous aider :)
Amicalement,
--
Étienne Mollier
Fingerprint: 5ab1 4edf 63bb ccff 8b54 2fa9 59da 56fe fff3 882d
Et Hip, Hip, Hip, Hourra ! Pour le personnel infirmier ! o/
--lrZ03NoBR/3+SXJZ
Content-Type: application/pgp-signature; name="signature.asc"
-----BEGIN PGP SIGNATURE-----
iQGzBAABCgAdFiEEiWj4FzqNZS4rFmXPZAyZDOTALZsFAl56dy0ACgkQZAyZDOTA
LZsyuAwAwKYFnT/KBgvznjAOBDwk3Wxb/pfohV5AgbvSWZChMwJsZwl8p5EsnQqD
IQwU34JCyTYVxVkCqDY4Hul2kJngCjgAEtKHYbzSg+a9Gf4TpLnYBfpgamTLFdVh
/jTJ3lcjL39WOFjAOhZDYC7jD/5O2E25SH1ab0dv9JTXOJG3foVqe1vGW2bcfCSH
xuypILsYApMCLoIhsxz5BhhesRVm7/RP93hZSjbxdzCT8NXPCBccgzD1nQsWM7yM
fjmVOGpv/ziDfQf8iweYSLPv17zh5uzrgphpFSRf6P4KY5x90ceRB1gYnHVmqC5Y
EuzJm6DvFg8saYFsbV794EBtAr2nq7XdQosNrOEB+uOXdLkuxIOoaLrnd0TuTM2q
fqoErK28c7q3nOGb7wO7w3GQ3GEgDTxRqCh3VdDXPrAlaAGxppG2R9CnVizTtVds
aKfHIMddiNiIzxNG54Qww0993FScX0548SIc+sQYCsAxnZkddmtMbs+bQUm72DQs
6uD0JqrF
_iY
-----END PGP SIGNATURE-----
--lrZ03NoBR/3+SXJZ--