Это похоже на регресс ядра в 4.x Linux, по крайней мере, для вашего конкретного оборудования.
http://archlinuxarm.org/forum/viewtopic.php?f=53&t=8798
Это может быть в этом коммите, но трудно сказать, поскольку вы не предоставили никакой дополнительной информации о своей системе.
https://github.com/torvalds/linux/commit/a0b5cd4ac2d6542d524d8063961bf914b5df1efa
В некоторых системах, по-видимому, возникают проблемы как минимум с USB 3: https://lists.debian.org /debian-kernel/2015/08/msg00066.html
Итак, реальный вопрос заключается в том, какое у вас оборудование и какое последнее ядро 4.x вы пробовали. Это могло быть решено в недавнем выпуске 4.x. Проблема с usb 2 и 3, или только с 3, или не связана с версией usb? Это поможет сузить круг вопросов. Ваши данные выглядят так, как будто это просто usb2 max в вашей системе.
Регрессия ядра - это нормально.
Как я говорю людям, когда они задают вопросы такого типа, новое ядро Linux имеет несколько возможных результатов:
https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1455376 {{1} } Это ошибка Ubuntu с обработкой usb.
Обычно ошибки, влияющие на то, что используют многие люди, исправляются относительно быстро, поэтому стоит проверить последний выпуск последнего стабильного ядра, который, как мне кажется, сейчас 4.3.
Если вы используете ubuntu, вы можете запустить ядро Liquorix, по крайней мере, если это текущий ubuntu, а не LTS, то же самое для нестабильных выпусков debian.
Просмотр: inxi -bxxx поможет показать основы вашей системы. inxi можно установить из большинства репозиториев дистрибутивов.
Вот список изменений USB для 4.0 / 3.20 Грега К. Х.
usb: musb: fix device hotplug behind hub
usb: dwc2: Fix a bug in reading the endpoint directions from reg.
staging: emxx_udc: fix the build error
usb: Retry port status check on resume to work around RH bugs
Revert "usb: Reset USB-3 devices on USB-3 link bounce"
uhci-hub: use HUB_CHAR_*
usb: kconfig: replace PPC_OF with PPC
ehci-pci: disable for Intel MID platforms (update)
usb: gadget: Kconfig: use bool instead of boolean
usb: musb: blackfin: remove incorrect __exit_p()
USB: fix use-after-free bug in usb_hcd_unlink_urb()
ehci-pci: disable for Intel MID platforms
usb: host: pci_quirks: joing string literals
USB: add flag for HCDs that can't receive wakeup requests (isp1760-hcd)
USB: usbfs: allow URBs to be reaped after disconnection
cdc-acm: kill unnecessary messages
cdc-acm: add sanity checks
usb: phy: phy-generic: Fix USB PHY gpio reset
usb: dwc2: fix USB core dependencies
usb: renesas_usbhs: fix NULL pointer dereference in dma_release_channel()
http://kernelnewbies.org/Linux_4.0 показывает полный набор изменений.
https://lkml.org/lkml/2015/6/26/511 это изменения в USB для 4.2-rc1. Как видите, вопрос «что изменилось», вероятно, не совсем правильный вопрос, более полезным было бы определить, решена ли проблема для вашего оборудования в последних выпусках.
{
if (dom[$1])
dom[$1]=dom[$1]","$2
else
dom[$1]=$2
}
END {
ORS=",";
for (d in dom)
if (d)
print ("\""d"(server:"dom[d]")""\"")
}
Это быстрое и грязное решение для awk. Сохраните его как something.awk, затем запустите:
awk -f something.awk Names.txt
Быстрое исправление в ответ на ваш комментарий :
{ dom[$1]=dom[$1] ? dom[$1]",server:"$2 : "server:"$2 }
END {
for (d in dom)
if (d) {
out && out = out","
out = out"\""d"("dom[d]")""\""
}
print out
}
Вы можете использовать этот код. Прочтите код перед его выполнением, поскольку он создает каталог в папке /tmp
с именем domains
, а затем удаляет его в конце
DOMAIN=''
IFS=' '
declare -A domain
mkdir /tmp/domains
while read line
do
DOMAIN=$(echo $line | awk '{print $1}')
SERVER=$(echo $line | awk '{print $2}' )
echo "$SERVER," >> /tmp/domains/$DOMAIN
domain[$DOMAIN]=1
done < Names.txt
sed -ir "$ s/.,$//" /tmp/domains/*
for i in "${!domain[@]}"; do
echo -n "$i(server:";
while read line ; do
echo -n "$line" ;
done < /tmp/domains/$i
echo ")"
done
rm -rf /tmp/domains
Это создает папку в папке /tmp со следующими данными, так что каждое имя файла домена имеет список содержащихся в них серверов
$ ls -lhtr /tmp/domains/
total 12K
-rw-rw-r-- 1 arushirai arushirai 11 Jun 19 17:54 TADDomain
-rw-rw-r-- 1 arushirai arushirai 16 Jun 19 17:54 LinkDomain
-rw-rw-r-- 1 arushirai arushirai 32 Jun 19 17:54 ABCDomain
$ cat /tmp/domains/ABCDomain
ContractABCServer_1,
ABC_server
$ cat /tmp/domains/LinkDomain
CoreLinkServer_
$ cat /tmp/domains/TADDomain
TADServer_
Вы можете собрать строки, разделенные запятыми -, непосредственно в awk
и напечатать композит в конце:
$1 == "ABCDomain" {d = (d == "") ? $2 : d "," $2; next}
$1 == "LinkDomain" {l = (l == "") ? $2 : l "," $2; next}
$1 == "TADDomain" {t = (t == "") ? $2 : t "," $2; next}
END {
printf("\"ABCDomain(server:%s)\",\"LinkDomain(server:%s)\",\"TADDomain(%s)\"\n", d, l, t)
}
Пр.
$ awk '
$1 == "ABCDomain" {d = (d == "") ? $2 : d "," $2; next}
$1 == "LinkDomain" {l = (l == "") ? $2 : l "," $2; next}
$1 == "TADDomain" {t = (t == "") ? $2 : t "," $2; next}
END {
printf("\"ABCDomain(server:%s)\",\"LinkDomain(server:%s)\",\"TADDomain(%s)\"\n", d, l, t)
}' Names.txt
"ABCDomain(server:ContractABCServer_1,ABC_server1)","LinkDomain(server:CoreLinkServer_1)","TADDomain(TADServer_1)"
(Обновлено для исправления выходного формата)
Использованиеawk
:
BEGIN { OFS = "," }
{ servers[$1] = (servers[$1] == "" ? "server:" $2 : servers[$1] "," "server:" $2 ) }
END {
$0 = ""
for (domain in servers)
$(++n) = sprintf("\"%s(%s)\"", domain, servers[domain])
print
}
Это добавит серверы в виде строки -с разделителями-запятыми к определенному домену в основном блоке при анализе входного файла. Это делается путем изменения массива servers
, который содержит серверы для определенного домена, (домен является ключом в массиве ).
В блоке END
мы перебираем все ключи/домены в массиве servers
и создаем выходную запись в указанном формате.
Запуск на предоставленных данных:
$ awk -f script.awk names.txt
"TADDomain(server:TADServer_1)","ABCDomain(server:ContractABCServer_1,server:ABC_server1)","LinkDomain(server:CoreLinkServer_1)"
Практически эквивалентный bash
скрипт (требует bash
4.3+ для ассоциативного массива):
declare -A servers
while read domain server; do
servers[$domain]+="${servers[$domain]:+,}server:$server"
done <names.txt
for domain in "${!servers[@]}"; do
out+="${out:+,}\"$domain(${servers[$domain]})\""
done
printf '%s\n' "$out"
... но см. " Почему использование цикла оболочки для обработки текста считается плохой практикой? ".