Объедините два текста со сравнением строк и выберите строки одного текста, если некоторые столбцы похожи

Похоже, это должно работать, за исключением того, что вывод lsusbсодержит двоеточие после номера устройства:

$ lsusb -d 1d6b:0002
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Таким образом, переменная devisбудет содержать это, и в конечном результате вы попытаетесь получить доступ к /dev/bus/usb/001/001:с двоеточием.

Вы можете избавиться от завершающего двоеточия с суффиксом -, удалив расширение, например:

devis=${devis%:}

Другой способ сделать это только в оболочке (безawk)— просто readвывести lsusb. Это берет только первую строку выходов lsusb, их может быть больше, если есть более одного совпадающего устройства.

В оболочках с заменой процесса:

read x buss x devis x < <(lsusb -d 04f9:0272)
devis=${devis%:}
chmod +w "/dev/bus/usb/$buss/$devis"

Или с трубой:

lsusb -d 04f9:0272 | {
   read x buss x devis x
   devis=${devis%:}
   chmod +w "/dev/bus/usb/$buss/$devis"
}
0
26.04.2019, 09:25
1 ответ

Используйтеawk:

awk -F',' '!seen[$1,$2]++' file1 file2

Пояснение:

  • В начале элемент массива с ключевыми полями $1,$2не назначен, поэтому ложно.
  • Если оно ложно, !seenистинно, поэтому мы увеличиваем его (, делаем его истинным )и выполняем действие по умолчанию, которое равно print.
  • Если это правда, (второй раз, когда мы видим те же поля,)!seenневерно, и awkпропустит эту строку.
0
28.01.2020, 03:46

Теги

Похожие вопросы