Сравните старый файл и новый файл, но проигнорируйте строки, которые только существуют в новом файле?

Старая добрая энергия ;) (с сортировкой, просмотром, и т.д.)

vim .
7
26.09.2015, 17:34
5 ответов

Использовать join объединить согласующие отрезки длинной линии из этих двух файлов. Принятие имен файлов происходит после контрольных сумм (как в md5sum вывод), и не содержат пробел, это распечатает все имена файлов, которые присутствуют в обоих списках, вместе со старой контрольной суммой и новой контрольной суммой:

join -1 2 -2 2 <(sort -k 2 oldlist) <(sort -k 2 newlist)

Чтобы также видеть новые файлы передайте -a опция к join. Немного выходной постобработки удалит имена файлов, для которых не изменилась контрольная сумма.

join -a 2 -1 2 -2 2 <(sort -k 2 oldlist) <(sort -k 2 newlist) |
awk '$2 != $3'
5
27.01.2020, 20:16

Вы могли сделать это с awk один:

$ awk 'FNR==NR   { o[$2]=$1; next }       !o[$2] { print $0, "NEW"; next } 
       $1!=o[$2] { print $0, "CHANGED" }' newlist oldlist

(Обратите внимание, что воображаемый формат файлов md5sumвыходной формат: "имя файла md5".)

Обновление: пошаговое объяснение как это awk работы остроты.

awk 'FNR==NR { # if current record number==overall record number (still processing the first file)
  o[$2]=$1     # store the record in array o: the key is the file name, the value is the md5
  next         # go to next record (do not execute the rest of the code)
}
# reaching this point means we are processing the second input file
!o[$2] {       # if array o not contains item with the current record`s file name
  print $0, "NEW" # print the current record and specify that it`s new
  next         # go to next record (do not execute the rest of the code)
}
# reaching this point means array o contains item with the current file name
$1!=o[$2] {    # if the current md5 is not equal with the md5 save for the current file name
  print $0, "CHANGED" # print the current record and specify it`s changed
}' newlist oldlist
3
27.01.2020, 20:16
  • 1
    хороший ответ, Вы возражаете добавлять маленькое объяснение awk программы? Например, это FNR == НОМЕР защиты действие от применения к 2-му файлу и т.д. –  maxschlepzig 08.09.2011, 22:26
  • 2
    @maxschlepzig, я добавил объяснение. В случае, если это не встречается ТАК стандарты и ожидания, я открыт, чтобы предложения обновили его. –  manatwork 09.09.2011, 09:57

если я понял Ваш вопрос правильно затем comm может действительно сделать то, что Вы хотите. Я предложил бы изучить comm --help

specificically

  -1              suppress column 1 (lines unique to FILE1)
  -2              suppress column 2 (lines unique to FILE2)
  -3              suppress column 3 (lines that appear in both files)

так comm newFile oldFile -1 -3 сделает то, что Вы хотите.

3
27.01.2020, 20:16

Предположим, что файлы похожи (разделенное пространство):

file1 md5sum1
file2 md5sum2

Простое решение:

# get only the files:
cut -f 1 -d " " oldlist > oldlist.files 

# from newlist, take only files which were also in the oldlist (updated files)
grep -w -F -f oldlist.files newlist > newlist.updated_files

И затем можно просто сравнить эти два файла (после сортировки):

sort -u oldlist > oldlist.su
sort -u newlist.updated_files > newlist.updated_files.su
diff oldlist.su newlist.updated_files.su
1
27.01.2020, 20:16

В качестве альтернативы я всегда использовал " sdiff -s" для сравнения списков файлов или md5sums.

Предполагая, что файлы являются нормальными, md5sum выводит " md5hash filename". Тогда либо:

sdiff -s oldfile newfile | grep -v ">"
# sorting on the md5hash should help align and pick up renamed files.
sdiff -s <(sort oldfile) <(sort newfile)

Разбираем это:
sdiff -s:подавляет общие строки, поэтому точные совпадения игнорируются. Показывает |, <, >для различий.
<(sort oldfile):команда выполняет сортировку перед sdiff.
grep -v ">":Игнорировать записи новых файлов. Работает, только если у вас нет >в имени файла, что в любом случае маловероятно.

Ширина sdiffможет быть изменена для отображения более длинных строк -w 100.

1
27.01.2020, 20:16

Теги

Похожие вопросы