
我有 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.csv
impo1.csv
expo1.csv
p2_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
,然後grep
在expo1.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