BASH: come ottenere output senza righe doppie?

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
Sargonsei
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2562
Iscrizione: domenica 17 febbraio 2008, 13:56

BASH: come ottenere output senza righe doppie?

Messaggio da Sargonsei »

Mi interessa l'output del comando

Codice: Seleziona tutto

:~$ X="0bda:57b5"; lsusb -vd $X |egrep "$X|bcdUSB|iProduct|Class|wTerminalType|wWidth|wHeight" # Sintesi periferica USB avente chip-ID contenuto nella variabile $X
Couldn't open device, some information will be missing
Bus 002 Device 005: ID 0bda:57b5 Realtek Semiconductor Corp. USB Camera
  bcdUSB               2.00
  bDeviceClass          239 Miscellaneous Device
  bDeviceSubClass         2 [unknown]
  iProduct                1 USB Camera
      bFunctionClass         14 Video
      bFunctionSubClass       3 Video Interface Collection
      bInterfaceClass        14 Video
      bInterfaceSubClass      1 Video Control
        wTerminalType      0x0201 Camera Sensor
        wTerminalType      0x0101 USB Streaming
      bInterfaceClass        14 Video
      bInterfaceSubClass      2 Video Streaming
        wWidth                            640
        wHeight                           480
        wWidth                            160
        wHeight                           120
        wWidth                            176
        wHeight                           144
        wWidth                            320
        wHeight                           240
        wWidth                            352
        wHeight                           288
      bInterfaceClass        14 Video
      bInterfaceSubClass      2 Video Streaming
      bInterfaceClass        14 Video
      bInterfaceSubClass      2 Video Streaming
      bInterfaceClass        14 Video
      bInterfaceSubClass      2 Video Streaming
      bInterfaceClass        14 Video
      bInterfaceSubClass      2 Video Streaming
      bInterfaceClass        14 Video
      bInterfaceSubClass      2 Video Streaming
      bInterfaceClass        14 Video
      bInterfaceSubClass      2 Video Streaming
      bInterfaceClass        14 Video
      bInterfaceSubClass      2 Video Streaming
ma senza tutte quelle righe doppie alla fine.
ho notato che se digito

Codice: Seleziona tutto

X="0bda:57b5"; lsusb -vd $X |egrep "$X|bcdUSB|iProduct|Class|wTerminalType|wWidth|wHeight" | sort -u # Sintesi periferica USB avente chip-ID contenuto nella variabile $X
Couldn't open device, some information will be missing
  bcdUSB               2.00
  bDeviceClass          239 Miscellaneous Device
  bDeviceSubClass         2 [unknown]
      bFunctionClass         14 Video
      bFunctionSubClass       3 Video Interface Collection
      bInterfaceClass        14 Video
      bInterfaceSubClass      1 Video Control
      bInterfaceSubClass      2 Video Streaming
Bus 002 Device 005: ID 0bda:57b5 Realtek Semiconductor Corp. USB Camera
  iProduct                1 USB Camera
        wHeight                           120
        wHeight                           144
        wHeight                           240
        wHeight                           288
        wHeight                           480
        wTerminalType      0x0101 USB Streaming
        wTerminalType      0x0201 Camera Sensor
        wWidth                            160
        wWidth                            176
        wWidth                            320
        wWidth                            352
        wWidth                            640
le righe doppie vengono tutte eliminate, ma le righe rimanenti vengono messe in ordine alfabetico (cosa che vorrei evitare)
e se digito

Codice: Seleziona tutto

X="0bda:57b5"; lsusb -vd $X |egrep "$X|bcdUSB|iProduct|Class|wTerminalType|wWidth|wHeight" | uniq -u # Sintesi periferica USB avente chip-ID contenuto nella variabile $X
Couldn't open device, some information will be missing
Bus 002 Device 005: ID 0bda:57b5 Realtek Semiconductor Corp. USB Camera
  bcdUSB               2.00
  bDeviceClass          239 Miscellaneous Device
  bDeviceSubClass         2 [unknown]
  iProduct                1 USB Camera
      bFunctionClass         14 Video
      bFunctionSubClass       3 Video Interface Collection
      bInterfaceClass        14 Video
      bInterfaceSubClass      1 Video Control
        wTerminalType      0x0201 Camera Sensor
        wTerminalType      0x0101 USB Streaming
      bInterfaceClass        14 Video
      bInterfaceSubClass      2 Video Streaming
        wWidth                            640
        wHeight                           480
        wWidth                            160
        wHeight                           120
        wWidth                            176
        wHeight                           144
        wWidth                            320
        wHeight                           240
        wWidth                            352
        wHeight                           288
      bInterfaceClass        14 Video
      bInterfaceSubClass      2 Video Streaming
      bInterfaceClass        14 Video
      bInterfaceSubClass      2 Video Streaming
      bInterfaceClass        14 Video
      bInterfaceSubClass      2 Video Streaming
      bInterfaceClass        14 Video
      bInterfaceSubClass      2 Video Streaming
      bInterfaceClass        14 Video
      bInterfaceSubClass      2 Video Streaming
      bInterfaceClass        14 Video
      bInterfaceSubClass      2 Video Streaming
      bInterfaceClass        14 Video
      bInterfaceSubClass      2 Video Streaming
le righe rimangono al loro posto, ma le righe doppie non vengono eliminate.
Qualcuno è in grado di dirmi in che modo devo scrivere il comando per eliminare le righe doppie senza mettere le altre righe in ordine alfabetico?
Ringrazio sin d'ora chi mi aiuterà.
Postare l'output di un comando significa inserire nel post: la riga in cui si digita il comando, tutto l'output, e la riga in cui il prompt ricompare.
Hardware e Sistema Operativo di Sargonsei: http://sargonsei.altervista.org/hardwar ... r-fisso-2/
Comandi da tenere a portata di mano: http://sargonsei.altervista.org/655-2/
Lucio C
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 406
Iscrizione: venerdì 10 dicembre 2021, 18:33
Desktop: fvwm
Distribuzione: (X)Ubuntu20@home; openSUSE42.3@work
Sesso: Maschile
Località: Paneropoli

Re: BASH: come ottenere output senza righe doppie?

Messaggio da Lucio C »

Quali sono le "righe doppie" ? quelle dalla 25ma in poi con bInterfaceClass e affini ? SE il numero di righe e' fisso pipare il comando in

Codice: Seleziona tutto

| awk 'NR<25'
SE si vogliono eliminare tutte le righe con bInterface piparlo in

Codice: Seleziona tutto

| awk '$1 !~ /bInterface/'
Ma questo elimina anche le righe 9-10 e 13-14 che non so se sia desiderabile. Ho provato questo

Codice: Seleziona tutto

| awk '($1 !~ /bInterface/ && NR>14) || NR<=14 {print NR,$0}' 
Notare che la azione {print NR,$0} la ho messa solo per debug, mostra il numero della riga e il suo contenuto. In "produzione" puo' essere omessa, la azione di default di awk e' print $0.

Se il numero di righe non e' fisso occorre fare qualcosa di piu' complesso, meglio scriverlo in uno scriptino awk e piparlo in una sua invocazione. P.es. a BEGIN mettere un flag a 0, quando si trova una riga con un pattern dopo la quale bInterface non interessa piu' mettere il flag a 1, e poi usare una condizione tipo flag==0 || (flag==1 && $1 !~ /bInterface/) per stampare
The reasonable man adapts himself to the world: the unreasonable one persists in trying to adapt the world to himself. Therefore all progress depends on the unreasonable man. (G.B. Shaw)
Avatar utente
Sargonsei
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2562
Iscrizione: domenica 17 febbraio 2008, 13:56

Re: BASH: come ottenere output senza righe doppie?

Messaggio da Sargonsei »

Ciao Lucio C
Il problema è che: quando X="0bda:57b5", le righe doppie sono concentrate dalla 25 in poi e contengono tutte "bInterface", ma io conto di utilizzare questo comando anche con altri ID, e con altri ID si rischia di cancellare anche righe che devono rimanere, per questo desidero cancellare esclusivamente righe doppie e senza metterle in ordine alfabetico.
Postare l'output di un comando significa inserire nel post: la riga in cui si digita il comando, tutto l'output, e la riga in cui il prompt ricompare.
Hardware e Sistema Operativo di Sargonsei: http://sargonsei.altervista.org/hardwar ... r-fisso-2/
Comandi da tenere a portata di mano: http://sargonsei.altervista.org/655-2/
nicNiz
Prode Principiante
Messaggi: 55
Iscrizione: domenica 4 ottobre 2020, 20:31

Re: BASH: come ottenere output senza righe doppie?

Messaggio da nicNiz »

Come pseudo codice potresti
mettere la prima riga dell'output in un array
fare un ciclo
foreach (?) RIGA dell'output
se l'array non contiene RIGA, la aggiungi all'array

Avrai un'array di righe non in ordine alfabetico e non doppie
Ma non ho idea di come si possa fare in bash
Il mio Linguaggio di scripting dichiarativo
https://dunocode.altervista.org
Lucio C
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 406
Iscrizione: venerdì 10 dicembre 2021, 18:33
Desktop: fvwm
Distribuzione: (X)Ubuntu20@home; openSUSE42.3@work
Sesso: Maschile
Località: Paneropoli

Re: BASH: come ottenere output senza righe doppie?

Messaggio da Lucio C »

Detto cosi' il problema e' indefinito ... non esiste una definizione univoca della condizione per cui una riga sia doppia e/o interessante. O basta che non sia gia' comparsa identica ?

Una soluzione pesante (in memoria), che sfrutta gli array associativi di awk, potrebbe essere di salvare ogni riga in un elemento dell'array indiciato sull'intero contenuto della riga (p.es. mioarray[$0]=$0) e poi fare un loop sull'intero array (vedere man awk, comando if (val in array) ... nella mia man page sta al 38%) e stampare solo le righe che non sono gia' nell'array ... anzi forse va prima fatta la stampa condizionale e poi salvato nell'array

Suggerirei comunque di salvare l'intero output del comando per ogni device in un file .txt (quello che ho fatto pastando dal forum per le poche prove che ho fatto) e provare lo script awk su tali file .txt fino a che si trova una ricetta accettabile

Oppure fare due o tre passi. P.es. salvando l'output di lsusb pipato in

Codice: Seleziona tutto

| sort | /usr/bin/uniq -d -c
questo indica solo le righe doppie e quante volte capitano. Dopo di che si scrive un awk temporaneo che esclude tali righe salvo la prima occorrenza e si rigira lsusb pipato in tale awk. Lasciato come esercizio al lettore :D
The reasonable man adapts himself to the world: the unreasonable one persists in trying to adapt the world to himself. Therefore all progress depends on the unreasonable man. (G.B. Shaw)
Avatar utente
Sargonsei
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2562
Iscrizione: domenica 17 febbraio 2008, 13:56

Re: BASH: come ottenere output senza righe doppie?

Messaggio da Sargonsei »

Lucio C ha scritto:
oggi, 15:09
Detto cosi' il problema e' indefinito ... non esiste una definizione univoca della condizione per cui una riga sia doppia e/o interessante. O basta che non sia gia' comparsa identica ?
... omissis ...
basta che non sia gia' comparsa identica.
Postare l'output di un comando significa inserire nel post: la riga in cui si digita il comando, tutto l'output, e la riga in cui il prompt ricompare.
Hardware e Sistema Operativo di Sargonsei: http://sargonsei.altervista.org/hardwar ... r-fisso-2/
Comandi da tenere a portata di mano: http://sargonsei.altervista.org/655-2/
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 1 ospite