我生成了 2 個 .csv 檔案,一個包含目錄中某些檔案的原始 md5sum,另一個包含在特定時刻計算的 md5sum。
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 部分苦苦掙扎,我必須按照上面的要求去做。我不知道是否有更好的方法來做到這一點,我是新手。
uj5u.com熱心網友回復:
我會AWK按照以下方式使用 GNU 來完成這項任務,讓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 是全域的行數,只有在處理第一個檔案時它們才相等。在處理第一個檔案時,我創建了陣列arr,因此鍵是檔案名,值是相應的哈希值,next導致 GNUAWK轉到下一行,即不執行其他操作,因此僅對除第一個檔案之外的所有檔案應用休息。($3 in arr)是條件:當前$3是 的鍵之一arr嗎?如果它確實成立,我print將當前$3(即檔案名)hash changed from字串值連接到$3來自陣列的鍵arr(即舊哈希值)to字串$1(當前哈希值)。如果給定的檔案名不在陣列中arr然后不采取任何行動。編輯:為哈希添加了排除項,未按照評論中的建議進行更改。
(在 gawk 4.2.1 中測驗)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/477079.html
