Bash сценарий сравнения двух текстовых файлов

0

Учитывая два файла, я хочу написать сценарий оболочки, который читает каждую строку из файла file1 и проверяет, есть ли он в файле file2. Если строка не найдена в file2, она должна сохранить ее, скажем, в таблице TAB1. Кроме того, если в файле 2 есть какие-либо дополнительные строки, которых нет в файле 2, следует сохранить их, скажем, в таблице TAB2.

Файлы могут содержать слова чисел или что-нибудь. Например :

файл1:

Hi!
1234
5678
1111
hello

file2:

1111
5678
1234
Hi!
hellothere

В этом случае должно быть «привет» в TAB1 и «привет» в TAB2

Если два файла равны, я хочу вернуть «файлы равны» эхо или что-то в этом роде.

Как я могу это сделать? Я пытался экспериментировать с diff, но безуспешно.

заранее спасибо

SSV
источник

Ответы:

0

Сначала вам нужно отсортировать каждый файл. Тогда вам нужно использовать comm. Наконец вы можете извлечь столбцы, которые commпроизводят с помощью awk. Ну как то так.

#! /bin/bash
sort $1 > $1.sorted
sort $2 > $2.sorted
comm -3 $1.sorted $2.sorted > columns
if [ -s columns ]; then
  TAB1="$(awk '{ print $1 }' < columns)"
  TAB2="$(awk '{ print $2 }' < columns)"
  # do something with TAB1 and TAB2
else
  echo $1 and $2 contain the same data
fi

Вы бы назвали этот скрипт так:

./myscript file1 file2

после выполнения сценария с помощью chmod.

Робин Грин
источник
О, это хорошо. Есть ли простой способ получить эти столбцы в переменную / таблицу? Мне нужно выполнить над ними дополнительные операции перед выводом на печать
SSV
@SSV Хорошо, я обновил это
Робин Грин
ну, все сохраняется в TAB1 таким образом. TAB2 пуст (один TAB должен содержать дополнительные записи, второй пропущенные записи).
SSV
Частично это удалось, запустив comm дважды - один раз с -13, а затем с -23
SSV