Как найти не совпадающие -строки из первого файла при поиске файлов?

Я использую NixOS со Sway и без X11. Мне удалось воссоздать вашу ошибку, закомментировав эту строку в моем файле configuration.nix:

hardware.opengl.enable = true;

После восстановления линии Sway работала должным образом.

0
09.09.2020, 20:23
2 ответа

Обработка строк 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
0
18.03.2021, 23:07

Этот ответ представляет собой комбинацию исходного сообщения @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

Поскольку некоторые из первоначальных вопросов остались без ответа (, находятся ли данные в полях, имеют ли значение пробелы, какие объемы данных ), комментарии приветствуются.

0
18.03.2021, 23:07

Теги

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