Я создал 2 файла .csv, один из которых содержит исходные суммы md5 некоторых файлов в каталоге, а другой содержит суммы md5, рассчитанные в определенный момент.
md5_original.csv
----------
$1 $2 $3
7815696ecbf1c96e6894b779456d330e,,s1.txt
912ec803b2ce49e4a541068d495ab570,,s2.txt
040b7cf4a55014e185813e0644502ea9,,s64.txt
8a0b67188083b924d48ea72cb187b168,,b43.txt
etc.
md5_$current_date.csv
----------
$1 $2 $3
7815696ecbf1c96e6894b779456d330e,,s1.txt
4d4046cae9e9bf9218fa653e51cadb08,,s2.txt
3ff22b3585a0d3759f9195b310635c29,,b43.txt
etc.
* some files could be deleted when calculating current md5sums
Я хочу перебрать значения столбца $3 в md5_$current_date.csv
и для каждого значения этого столбца проверить, существует ли он в md5_original.csv
, и если да, то, наконец, сравнить его значение с $1.
Вывод должен быть:
s2.txt hash changed from 912ec803b2ce49e4a541068d495ab570 to 4d4046cae9e9bf9218fa653e51cadb08.
b43.txt hash changed from 8a0b67188083b924d48ea72cb187b168 to 3ff22b3585a0d3759f9195b310635c29.
Я написал сценарий для создания этих двух файлов .csv, но я изо всех сил пытаюсь выполнить часть awk, где мне нужно сделать то, что я просил выше. Я не знаю, есть ли лучший способ сделать это, я новичок.
Я бы использовал GNU AWK
для этой задачи следующим образом, пусть md5_original.csv
контент будет
7815696ecbf1c96e6894b779456d330e {BLANK_COLUMN} s1.txt
912ec803b2ce49e4a541068d495ab570 {BLANK_COLUMN} s2.txt
040b7cf4a55014e185813e0644502ea9 {BLANK_COLUMN} s64.txt
8a0b67188083b924d48ea72cb187b168 {BLANK_COLUMN} b43.txt
и md5_current.csv
содержание быть
7815696ecbf1c96e6894b779456d330e {BLANK_COLUMN} s1.txt
4d4046cae9e9bf9218fa653e51cadb08 {BLANK_COLUMN} s2.txt
3ff22b3585a0d3759f9195b310635c29 {BLANK_COLUMN} b43.txt
потом
awk 'FNR==NR{arr[$3]=$1;next}($3 in arr)&&($1 != arr[$3]){print $3 " hash changed from " arr[$3] " to " $1}' md5_original.csv md5_current.csv
выход
s2.txt hash changed from 912ec803b2ce49e4a541068d495ab570 to 4d4046cae9e9bf9218fa653e51cadb08
b43.txt hash changed from 8a0b67188083b924d48ea72cb187b168 to 3ff22b3585a0d3759f9195b310635c29
Объяснение: FNR — это номер строки в текущем файле, NR — это номер строки в глобальном масштабе, они равны только при обработке 1-го файла. При обработке 1-го файла я создаю массив arr
, так что ключи — это имена файлов, а значения — соответствующие хэш-значения, next
заставляют GNU AWK
переходить к следующей строке, т. е. никаких других действий не предпринимается, поэтому отдых применяется только ко всем файлам, кроме первого. ($3 in arr)
условие: текущий $3
один из ключей arr
? Если это действительно так, я print
объединяю текущее $3
(то есть имя файла) hash changed from
строковое значение для ключа $3
из массива arr
(это старое хеш-значение) to
строку $1
(текущее хеш-значение). Если данное имя файла отсутствует в массиве arr
, то никаких действий не предпринимается.
Обновлено: добавлено исключение для хэша, который не изменился, как предложено в комментарии.
(проверено в gawk 4.2.1)
Готово. Я думал, что это поможет людям лучше понять структуру, но я исправил ее, как вы предложили.