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

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

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

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

пример ввода: файл 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 .

  • Создание электронной таблицы из текстового файла
  • Извлечь все до строки соответствия
  • количество слов между двумя фиксированными словами
  • Вставка пространства после 5 символов при подсчете обратного
  • Разделить строку на пары «ключ-значение» на основе первой строки
  • Как объединить строки с фиксированным интервалом в файле?
  • Сохраняйте символы до и после определенного символа
  • Строки Grep до после, если значение строки больше нуля
  • Удалите все, что не является числом из 4 символов.
  • Как слить весь файл в другую папку в один файл и добавить новую строку
  • Как отобразить последний абзац текстового документа?
  • Linux и Unix - лучшая ОС в мире.