Я использую NixOS со Sway и без X11. Мне удалось воссоздать вашу ошибку, закомментировав эту строку в моем файле configuration.nix:
hardware.opengl.enable = true;
После восстановления линии Sway работала должным образом.
Обработка строк file1.txt
по отдельности:
for str in $(cat file1.txt) ; do
num=$(grep -w "$str" file2.txt | wc -l )
if [[ $num -eq 0 ]] ; then
echo "$str"
fi
done
Этот ответ представляет собой комбинацию исходного сообщения @danvoronov и решения @waltinator по получению неиспользуемых ключей с улучшениями обоих.
У меня есть около 60 строк Bash и awk, которые создают тестовые файлы, используя случайный выбор из наборов английского языка в материалах курса Princeton CS50. У меня также есть 30 строк Bash и awk, которые решают эту проблему в одном процессе. Это требует улучшения производительности, поэтому я пока не буду его публиковать.
Мой скрипт и приведенный ниже дают одинаковые результаты. Для справки и проверки каждому выходному тексту предшествует номер строки в исходном файле. Тестовые файлы состоят из 15000 более коротких записей в файле1 (, 12000, которые соответствуют файлу2, и 3000, которые не соответствуют, средняя длина 92 символа )и 20000 полных строк в файле2 (, средняя длина 129 символов ).
Ключи берутся из произвольной выборки больших записей, беря случайное число слов (, но не менее четырех ), начиная со случайного слова в строке.
Обратите внимание, что один ключ может соответствовать нескольким записям. Мы не пытаемся навязать один -на -одну пару.
Приведенный ниже сценарий работает с этим объемом данных примерно за 1 м :30 с (моего рабочего дня за 5 м :45 с ).
Данные из файла1 вряд ли будут допустимыми регулярными выражениями, поэтому -параметр F должен использоваться в grep. Если обычный текст обрабатывается как RE, многие символы, такие как *+. будет неожиданно совпадать, а другие, такие как ()[ ] | выдаст ошибки. -F также может быть намного быстрее (Я обнаружил улучшение в 600 раз --Я хочу знать, что это за алгоритм! ).
Команда grep для неиспользуемых ключей просто использует параметр -q, а статус показывает, произошло ли совпадение. Это экономит два процесса (подоболочки и wc -l для каждой строки в файле 1 ), а также в среднем вдвое уменьшает количество прочитанных данных, поскольку завершается при первом совпадении, а не при чтении всего файла.
#! /bin/bash
grep -n -w -F -f file1.txt file2.txt > file3.txt
while read -r Key; do
(( ++Fnr ))
grep -q -w -F -- "$Key" file2.txt || printf '%d:%s\n' "${Fnr}" "$Key"
done < file1.txt > file4.txt
Поскольку некоторые из первоначальных вопросов остались без ответа (, находятся ли данные в полях, имеют ли значение пробелы, какие объемы данных ), комментарии приветствуются.