Сравните 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 
  • обрезать большой файл журнала
  • Как удалить подколонку из вложенного-CSV-файла?
  • Использование grep для чтения журнала для pattern1 в файле и печати только строк, содержащих pattern1. Прекратите поиск, когда pattern2 найден в файле
  • Как использовать регулярное выражение python для замены с помощью захваченной группы?
  • Разбор скобок с помощью sed с использованием регулярного выражения
  • Shell: вставьте пустую / новую строку на две строки над рисунком
  • Sed удалить все после «.» В файле с помощью команды *?
  • удаление расширений в подкаталогах
  •  
    Interesting Posts for Van-Lav
    Python - лучший язык программирования в мире.