Как сравнить 2 файла слово за словом и сохранить разные слова в выходной файл результата - PullRequest
0 голосов
/ 11 июня 2019

Предположим, есть два файла:

File1.txt

My name is Anamika.

File2.txt

My name is Anamitra.

Я хочу сохранить файл результата:

Result.txt

Anamika                
Anamitra 

Я использую замазку, поэтому не могу использовать wdiff, любую другую альтернативу.

1 Ответ

0 голосов
/ 14 июня 2019

не мой лучший сценарий, но он работает.Другие могут придумать что-то более элегантное.

#!/bin/bash

if [ $# != 2 ]
then
    echo "Arguments: file1 file2"
    exit 1
fi

file1=$1
file2=$2

# Do this for both files
for F in $file1 $file2
do
    if [ ! -f $F ]
    then
        echo "ERROR: $F does not exist."
        exit 2
    else
        # Create a temporary file with every word from the file
        for w in $(cat $F)
        do
            echo $w >> ${F}.tmp
        done
    fi
done

# Compare the temporary files, since they are now 1 word per line
# The egrep keeps only the lines diff starts with > or <
# The awk keeps only the word (i.e. removes < or >)
# The sed removes any character that is not alphanumeric.
#         Removes a . at the end for example
diff ${file1}.tmp ${file2}.tmp | egrep -E "<|>" | awk '{print $2}' | sed 's/[^a-zA-Z0-9]//g' > Result.txt

# Cleanup!
rm -f ${file1}.tmp ${file2}.tmp

В этом используется трюк с циклом for.Если вы используете for для зацикливания файла, он будет зацикливаться на каждом слове.НЕ каждая строка, как начинающие в Bash, как правило, верят.Здесь на самом деле приятно знать, поскольку он преобразует файлы в 1 слово в строке.

Пример: содержимое файла == This is a sentence.
После завершения цикла for временныйфайл будет содержать:

This
is
a
sentence.

Тогда тривиально запустить diff для файлов.И еще одна деталь: ваш пример вывода не содержал . в конце, поэтому команда sed оставляла только буквенно-цифровые символы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...