Сравните 2 файла и удалите любые строки в файле2, когда они соответствуют значениям, найденным в файле1

У меня два файла. Я пытаюсь удалить любые строки в файле2, когда они соответствуют значениям, найденным в файле1. В одном файле есть список:

File1

ZNI008 ZNI009 ZNI010 ZNI011 ZNI012 

… над 19463 линиями

Второй файл включает строки, которые соответствуют элементам, перечисленным вначале: File2

 copy /Y \\server\foldername\version\20050001_ZNI008_162635.xml \\server\foldername\version\folder\ copy /Y \\server\foldername\version\20050001_ZNI010_162635.xml \\server\foldername\version\folder\ copy /Y \\server\foldername\version\20050001_ZNI012_162635.xml \\server\foldername\version\folder\ copy /Y \\server\foldername\version\20050001_ZNI009_162635.xml \\server\foldername\version\folder\ 

… продолжает листинг до строки 51360

То, что я пробовал до сих пор:

 grep -v -i -f file1.txt file2.txt > f3.txt 

не выводит результат на f3.txt или удаляет любые строки. Я проверил, выполнив

 wc -l file2.txt 

и результат

 51360 file2.txt 

Я считаю, что причина в том, что нет точных совпадений. Когда я запускаю следующее, он ничего не показывает

 comm -1 -2 file1.txt file2.txt 

Бег

 ( tr '\0' '\n' < file1.txt; tr '\0' '\n' < file2.txt ) | sort | uniq -c | egrep -v '^ +1' 

показывает только одно совпадение, хотя я ясно вижу, что существует более одного матча.

Кроме того, все данные помещаются в один файл и выполняются следующие действия:

 grep -Ev "$(cat file1.txt)" 1>LinesRemoved.log 

говорит, что аргумент имеет слишком много строк для обработки.

Мне нужно удалить строки, соответствующие элементам в файле1 из файла2.

Я также пытаюсь использовать это в python: `

  #!/usr/bin/python s = set() # load each line of file1 into memory as elements of a set, 's' f1 = open("file1.txt", "r") for line in f1: s.add(line.strip()) f1.close() # open file2 and split each line on "_" separator, # second field contains the value ZNIxxx f2 = open("file2.txt", "r") for line in f2: if line[0:4] == "copy": fields = line.split("_") # check if the field exists in the set 's' if fields[1] not in s: match = line else: match = 0 else: if match: print match, line, 

`

он плохо работает .. как im получаю «Traceback (последний последний звонок): Файл« ./test.py », строка 14, в? если поля [1] не в s: IndexError: индекс индекса вне диапазона '

4 Solutions collect form web for “Сравните 2 файла и удалите любые строки в файле2, когда они соответствуют значениям, найденным в файле1”

Как насчет:

 grep -F -v -f file1 file2 > file3 

это использование Bash и GNU sed из-за переключения -i

 cp file2 file3 while read -r; do sed -i "/$REPLY/d" file3 done < file1 

есть, конечно, лучший способ, но вот взломать -i : D

 cp file2 file3 while read -r; do (rm file3; sed "/$REPLY/d" > file3) < file3 done < file1 

это использует порядок оценки оболочки


хорошо, я думаю, правильный путь с этой идеей – использование ed . Это тоже должно быть POSIX.

 cp file2 file3 while read -r line; do ed file3 <<EOF /$line/d wq EOF done < file1 

в любом случае, grep похоже, является правильным инструментом для работы.
Ответ @byrondrossos должен хорошо работать для вас;)

Это, по общему признанию, уродливое, но оно действительно работает. Однако путь должен быть одинаковым для всех (за исключением, конечно, части ZNI ###). Все, кроме ZNI ### пути, удаляются, поэтому команда grep -vf может корректно запускаться в отсортированных файлах.

Сначала преобразовать «testfile2» в «testfileconverted», чтобы просто показать ZNI ###

 cat /testfile2 | sed 's:^.*_ZNI:ZNI:g' | sed 's:_.*::g' > /testfileconverted 

Второе использование обратного grep преобразованного файла по сравнению с «testfile1» и добавление отформатированного вывода в «testfile3»

 bash -c 'grep -vf <(sort /testfileconverted) <(sort /testfile1)' | sed "s:^:\copy /Y \\\|server\\\foldername\\\version\\\20050001_:g" | sed "s:$:_162635\.xml \\\|server\\\foldername\\\version\\\folder\\\:g" | sed "s:|:\\\:g" > /testfile3 

Мне нравится решение grep от byrondrossos лучше, но вот еще один вариант:

 sed $(awk '{printf("-e /%s/d ", $1)}' file1) file2 > file3 
  • Как получить плоский XML, чтобы внешние объекты были объединены на верхний уровень
  • Рекурсивно перемещать каталог и заменять вызовы функций
  • Удаление дубликатов PCR из файла Fastq, содержащего уникальные молекулярные идентификаторы
  • Python или awk / sed для очистки данных
  • Shell: вставьте пустую / новую строку на две строки над рисунком
  • Как случайным образом удалить несколько строк из большого файла?
  • Sed скрипт для редактирования файла csv или Python
  • Как обрабатывать огромные текстовые файлы, содержащие символы EOF / Ctrl-Z, используя Python в Windows?
  •  
    Interesting Posts for Van-Lav

    Python: Есть ли способ получить локальную переменную функции внутри декоратора, который ее обертывает?

    Невозможно импортировать уценку из-за COMMAND_LINE_LOGGING_LEVEL

    Как проверить версию paramiko?

    Как принять keypress в командной строке python?

    Создание частичной замены SAS PROC SUMMARY в Python / Pandas

    Как я могу изменить конкретную метку строки в кадре данных Pandas?

    Как преобразовать datetime в integer в python

    Вставка Python не получает желаемых результатов?

    python – lxml: выполнение определенного порядка атрибутов

    Python urllib2.HTTPError: ошибка HTTP 503: служба недоступна на действующем веб-сайте

    TimedRotatingFileHandler не работает нормально в Django с несколькими экземплярами

    Как переместить местный сайт, созданный django, в другую машину?

    Parse config files, environment и аргументы командной строки, чтобы получить один набор параметров

    Постоянное изменение sys.path … хорошая идея или нет?

    igraph: почему функция add_edge настолько медленна, что она сопоставлена ​​с add_edges?

    Python - лучший язык программирования в мире.