Doublets cartes/sorties

classic Classic list List threaded Threaded
7 messages Options
Reply | Threaded
Open this post in threaded view
|

Doublets cartes/sorties

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

Reply | Threaded
Open this post in threaded view
|

Re: Doublets cartes/sorties

Étienne Mollier
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 %-s\n", 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 <[hidden email]>
Fingerprint:  5ab1 4edf 63bb ccff 8b54  2fa9 59da 56fe fff3 882d
Et Hip, Hip, Hip, Hourra !   Pour le personnel infirmier !   \o/

signature.asc (673 bytes) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: Doublets cartes/sorties

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 %-s\n", 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,

Reply | Threaded
Open this post in threaded view
|

Re: Doublets cartes/sorties

Étienne Mollier
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 %-s\n",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 <[hidden email]>
Fingerprint:  5ab1 4edf 63bb ccff 8b54  2fa9 59da 56fe fff3 882d
Et Hip, Hip, Hip, Hourra !   Pour le personnel infirmier !   \o/

signature.asc (673 bytes) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: Doublets cartes/sorties

Pierre ESTREM
Bonsoir,

 > pacmd list-cards | awk '/^\tname: <.*>$/{split($0,n,"^\tname:
<|>$");}/^\t+output:/{split($0,o,":");printf "%-31s %-s\n",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

Reply | Threaded
Open this post in threaded view
|

Re: Doublets cartes/sorties

Pierre ESTREM
In reply to this post by Étienne Mollier
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 %-s\n",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,

Reply | Threaded
Open this post in threaded view
|

Re: Doublets cartes/sorties

Étienne Mollier
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    $output"
>     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 <[hidden email]>
Fingerprint:  5ab1 4edf 63bb ccff 8b54  2fa9 59da 56fe fff3 882d
Et Hip, Hip, Hip, Hourra !   Pour le personnel infirmier !   \o/

signature.asc (673 bytes) Download Attachment