2016-03-02 2 views
0

Я довольно новичок в Bash и скриптах в целом и могу использовать некоторую помощь. Каждое слово в первом файле разделяется \n, а второй файл может содержать что угодно. Если строка в первом файле не найдена во втором файле, я хочу ее вывести. Довольно много «проверить, если эти слова в этих словах и скажите мне те, которые не являются»Создание сценария, который проверяет, есть ли каждое слово в файле

FILE1.TXT содержит что-то вроде:

dog 
cat 
fish 
rat 

file2.txt содержит что-то вроде:

dog 
bear 
catfish 

магия -> крыса

Я знаю, что я хочу использовать grep (или я?), и команда будет (к моему лучшему пониманию):

$foo.sh file1.txt file2.txt 

Теперь для сценария ...

Я понятия не имею ...

grep -iv $1 $2 
+0

Почему тег Python? Вы тоже интересуетесь этими ответами? – zondo

+0

жаль, что это был только рекомендуемый тег – dank

+0

Возможно ли это/проще с python? Я также новичок в python и использую spyder с gitbash. – dank

ответ

1

Дайте этому попытку. Это прямо вперед, и не оптимизирован, но она делает это (я думаю)

while read line ; do 
    fgrep -q "$line" file2.txt || echo "$line" 
done < file1.txt 

Существует забавная версия ниже, с 4 parrallel fgrep и использование дополнительного файла Result.txt.

> result.txt 
nb_parrallel=4 
while read line ; do 
    while [ $(jobs | wc -l) -gt "$nb_parralel" ]; do sleep 1; done 
    fgrep -q "$line" file2.txt || echo "$line" >> result.txt & 
done < file1.txt 
wait 
cat result.txt 

Вы можете увеличить значение 4, для того, чтобы использовать более parrallel fgrep, в зависимости от количества процессоров и ядер и IOPS доступных.

+0

оба были протестированы ok –

+0

Чтобы уточнить, вы прокладываете файл file1.txt, чтобы читать каждую строку, и для каждой строки fgrep каждой строки файла file2.txt и для печати строк, которые не удалось выполнить grep? – dank

+0

Да, это именно то, что он делает –

0

Вы можете просто сделать следующее:

comm -2 -3 file1.txt file2.txt 

, а также:

diff -u file1.txt file2.txt 

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

+1

это проверит для точного соответствия. – karakfa

1

Использование AWK вы можете сделать:

awk 'FNR==NR{a[$0]; next} {for (i in a) if (index(i, $0)) next} 1' file2 file1 

rat 
+1

'break' на самом деле ничего не делает, не так ли? У вас слишком много '' 's, так что, возможно, они оба остались в предыдущей версии. –

0

похожи awk

$ awk 'NR==FNR{a[$0];next} {for(k in a) if(k~$0) next}1' file2 file1 
rat 
+0

Nitpick: Если 'file1' имеет строку' dg', это будет неправильно опускать 'dog' на выходе :) – anubhava

+0

вправо, я предполагал, что соответствие шаблону не подстрочно – karakfa

1

С -f флагом вы можете сказать grep использовать файл.

grep -vf file2.txt file1.txt 

Чтобы получить хороший матч на комплектных линий, используйте

grep -vFxf file2.txt file1.txt 

Как @anubhava комментировали, это не будет соответствовать подстроки. Чтобы исправить это, мы будем использовать результат grep -Fof file1.txt file2.txt (все релевантные ключевые слова).

Комбинируя это даст

grep -vFxf <(grep -Fof file1.txt file2.txt) file1.txt 
+1

Это даст неправильные результаты, так как' catfish' не будет соответствовать 'cat 'или' fish' – anubhava

Смежные вопросы