使用 awk/for/grep 比較 2 個文件

使用 awk/for/grep 比較 2 個文件

我有 2 個 csv 文件,其內容是-

expo1.csv

102,偉大,形容詞,ENG,p1_0,否,p2_1,否,p3,否,4,是,p5_2,否,p6,是......,su1,amb,su_09,否

104、BHAAG,動詞,HIN,p1,是,p2,否,p3_7,amb,p4,否,p5,否,p6_9,是......,sg4_3,是,su119,amb

110,.......,su11_0,amb

impo1.csv

104,p1,no
102,p2,yes
104,p10,no
110,su11,no

基本上expo1.csv是伺服器上的一個文件,並且impo1.csv是我創建的用於更新的文件expo1.csv。在對 impo1 資料執行輕微處理後,腳本會expo1.csv按照 中指定的進行更改(例如,處理 102,p2,yes 行,然後對-進行更新。)impo1.csvimpo1.csvexpo1.csvp2_1,yes

expo1.csv更改後:

102,偉大,形容詞,ENG,p1_0,否,p2_1,是,p3,否,4,是,p5_2,否,p6,是......,su1,amb,su_09,否

104、BHAAG,動詞,HIN,p1,否,p2,否,p3_7,amb,p4,否,p5,否,p6_9,是......,sg4_3,是,su119,amb

110,.........,su11_0,沒有

現在,在腳本進行更改後,我們需要透過比較 impo1 和 expo1 檔案來驗證更改是否正確完成。這就是我被困的地方。

到目前為止,我可以使用以下方法將逗號之間的資料impo1.csv單獨隔離到變數中awk

Sno=104 102 104
Posw=p1 p2 p10
cho=no yes no

現在的問題是,我該如何檢查呢?這些impo1.csv文件包含大約 3000 個更新。如果我grep p1 expo1.csv|grep no expo1.csv,顯然它不會返回正確的結果,因為文件有許多“否”字串。我嘗試使用 for 循環將資料分離awk為單獨的變量,然後使用通配符 grep - grep sno expo1.csv|grep '/<$posw.*,$cho>/' expo1.csv- 但它不起作用。

使用 GNU bash 4.1.2。

編輯 - 應該早點提到這一點,我的錯 - impo1.csv 文件中沒有明確的模式,我可以用它來檢查 expo1 文件。我對範例文件內容進行了更正,以說明我的觀點。

答案1

解決方案相當簡單。您只需要從每一行建立一個模式impo1.csv,然後grepexpo1.csv更新後建立一個模式

validate() {
    # $1 ~ impo1.csv
    # $2 ~ expo1.csv after changes
    while read pattern; do
        grep -q "^$pattern" $2 || return 1
    done < <(sed "s/,/,.*/" $1 )
}

答案2

awk -F, '
    NR==FNR{
        for(i=1;i<NF;i)
            DATA[$1 SUBSEP $++i] = $++i;
        next
    }
    DATA[$1 SUBSEP $2] != $3
    ' expo1.csv impo1.csv

impo1.csv將列印與資料不同的行expo1.csv

相關內容