не мой лучший сценарий, но он работает.Другие могут придумать что-то более элегантное.
#!/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
оставляла только буквенно-цифровые символы.