найти строку из одного файла в другой, если нет, а затем удалить из исходного файла

Я пытаюсь создать скрипт, который просматривает каждую строку одного файла, и если строка не соответствует нигде в любой строке другого текстового файла, тогда удалите эту строку из исходного файла. до сих пор я безуспешно сделал скрипт, чтобы выполнить это, и в настоящее время он применяется только к первой строке на данный момент.

На самом деле нужна помощь в том, что я сделал неправильно в этом скрипте и как применять эти шаги по очереди к каждой строке исходного файла.

Примером ввода и вывода, требуемого от этого скрипта, будет:

пример ввода: файл 1 (файл групп),

hello hi hello hi great interesting file 2: this is a hi you see this is great don't ya think sometimes hello is a good expansion of its more commonly used shortening hi interesting how brilliant coding can be just wish i could get the hang of it 

Пример вывода сценария – файл 1 изменен на:

 hello hi great interesting 

Поэтому его удалили hi hello , потому что его нет во втором файле

вот сценарий, он, похоже, работает с точки зрения создания переменных.

 #take first line from stability.contigs.groups echo | head -n1 ~/test_folder/stability.contigs.groups > ~/test_folder/ErrorFix.txt #remove the last 5 character sed -i -r '$ s/.{5}$//' ~/test_folder/ErrorFix.txt #find match of the word string in errorfix.txt in stability.trim.contigs.fasta if not found then delete the line containing the string in stability.contigs.groups STRING=$(cat ~/test_folder/MothurErrorFix.txt) FILE=~/test_folder/stability.trim.contigs.fasta if [ ! -z $(grep "$STRING" "$FILE") ] then perl -e 's/.*\$VAR\s*\n//' ~/test_folder/stability.contigs.groups fi 

2 Solutions collect form web for “найти строку из одного файла в другой, если нет, а затем удалить из исходного файла”

Если у вас есть gnu grep вы можете запустить:

 grep -oFf file1 file2 | sort | uniq | grep -Ff - file1 

удалите последний grep если не нужно сохранять порядок строк в file1 .
Если у вас нет доступа к gnu grep , с awk :

 awk 'NR==FNR{z[$0]++;next};{for (l in z){if (index($0, l)) y[l]++}} END{for (i in y) print i}' file1 file2 

Пойдите для ответа (принятого) don_crissti, если у вас есть GNU grep . На всякий случай, если вы этого не сделаете (например, на стандартной Mac OS X, где это не будет работать), вы также можете сохранить этот фрагмент в сценарий bash, например myconvert.sh

 #!/bin/bash while IFS='' read -r line || [[ -n "$line" ]]; do if ! grep -Fq "$line" $2 then sed -i '' "/$(echo $line | sed -e 's/[]\/$*.^|[]/\\&/g')/d" $1 fi done < "$1" 

вызов его двумя файлами в качестве аргументов

 ./myconvert.sh file1 file2 

Однако, пожалуйста, обратите внимание на знающие комментарии don_crissti ниже относительно использования while / read и очевидных недостатков производительности при вызове sed .

  • Есть ли команда добавить новую строку в текстовый файл, если значение этой строки отличается от следующего?
  • Взять ввод из одного файла и добавить в другой файл в конкретном столбце
  • Удалите пробелы, кроме строк, начинающихся с определенного шаблона
  • Команда для хранения строк с определенной длиной в файле
  • Определите, как долго вкладки \ t 'находятся на линии
  • объединить два разных файла, имеющих различное количество строк строк
  • Разделить файл на отдельные файлы с помощью шаблона
  • Извлечь определенный раздел
  • Удалить строки в txt-файле, взяв шаблоны из другого файла
  • Как добавить строки файла в конец строк другого файла?
  • как удалить некоторые из строк в первом файле на основе информации из второго файла?
  • Linux и Unix - лучшая ОС в мире.