2016-10-11 12 views
0

Я пытаюсь найти несколько ключевых слов из одного файла, используя цикл while и проверяя в другом, если они присутствуют или нет. Если нет, они должны быть записаны в другом файле. Ниже мой кодИзмените скрипт, чтобы удалить else из условия

while read -r line; do 
if grep -q -e "$line" $file_name; then 
     echo "character found" 
else 
    echo "$line" >> notfound.txt 
fi 
done < result.txt` 

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

является также возможность использования во время цикла, начиная с возможно 3-й линии и в конце 2 строки перед

Заранее спасибо!

+0

Просьба предоставить образцы входных файлов и желаемый результат: http://stackoverflow.com/help/mcve –

ответ

1

Конечно, это может быть сделано в одной строке, путем проверки возвращаемого-кода команды, как это выполняется, см bash, exit-codes

#!/bin/bash 

while read -r line 
do 

    # On successful search 'grep' returns code '0', negating it for the 
    # unsuccessful case to return a 'true' condition 

    ! grep -q -e "$line" "$file_name" && echo "$line" >> notfound.txt 

done <result.txt 
0

Забудь; используйте comm (1), для чего это хорошо. Пример:

#!/usr/local/bin/bash 

cat >needles <<DONE 
p1 
n1 
p2 
n2 
DONE 

cat >haystack <<DONE 
p3 
p2 
p1 
DONE 

comm -23 <(sort -u needles) <(sort -u haystack) 
0

Предполагая, что $filename произвольный текстовый файл, и result.txt представляет собой файл, содержащий список слов, по одному в каждой строке.

#!/bin/bash 

# 1. get the list of words found in the file, store in an array 
mapfile -t found < <(grep -owFf result.txt "$filename" | sort -u) 

# 2. get the list of words not found 
grep -vxFf <(printf "%s\n" "${found[@]}") result.txt 

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

  • Нет связанных вопросов^_^