我正在嘗試使用 Awk 來比較兩個大型 CSV 檔案(每個超過 5000 行)的內容,但我無法得到我想要的。
這是我的問題:
我有一個包含名稱 ($1) 和城市 ($2) 的串列的第一個檔案 (File1),其結構如下所示:
john;london
marc;paris
karen;new york
ben;london
vic;dublin
我有一個包含其他資訊的第二個檔案 (File2),我們可以在其中找到 File1 的一些名稱 ($3):
45456;windows;john;454646
47764;mac;zack;470093
41225;mac;ben;622101
12634;windows;ben;218996
7856;windows;karen;637294
12;mac;finn;878317
2315;windows;beverly;221167
445;windows;lilly;12316
3232;mac;john;601316
4546;mac;fish;305035
487;windows;vic;447421
46464;mac;karen;468154
我想從 File2 中提取名稱出現在 File1 中的所有行,同時添加與 File1 中每個名稱關聯的城市。這是我正在尋找的結果示例:
45456;windows;john;454646;london
3232;mac;john;601316;london
7856;windows;karen;637294;new york
46464;mac;karen;468154;new york
41225;mac;ben;622101;london
12634;windows;ben;218996;london
487;windows;vic;447421;dublin
你可以幫幫我嗎?
uj5u.com熱心網友回復:
構建第一個檔案的關聯陣列,將名稱作為索引,將城市作為值。對于第二個檔案,檢查名稱是否在陣列中,如果是,則列印該行并附加城市。
awk -F';' 'NR==FNR{a[$1]=$2}$3 in a{print $0";"a[$3]}' File1 File2
45456;windows;john;454646;london
41225;mac;ben;622101;london
12634;windows;ben;218996;london
7856;windows;karen;637294;new york
3232;mac;john;601316;london
487;windows;vic;447421;dublin
46464;mac;karen;468154;new york
uj5u.com熱心網友回復:
與bash,GNU sort和GNU join:
join -t ';' -1 1 -2 3 <(sort File1) <(sort -t ';' -k 3 File2) -o 2.1,2.2,1.1,2.4,1.2
輸出:
12634;windows;ben;218996;倫敦 41225;mac;本;622101;倫敦 45456;窗戶;約翰;454646;倫敦 3232;麥克;約翰;601316;倫敦 46464;麥克;凱倫;468154;紐約 7856;windows;karen;637294;紐約 487;windows;vic;447421;都柏林
uj5u.com熱心網友回復:
使用 工具包
csvjoin -d ';' -H -c 3,1 File2 File1 | csvformat -D ';' | tail -n 2
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/367426.html
