我一直在嘗試使用簡單的 shell 腳本比較兩個 csv 檔案,但我認為我使用的代碼沒有完成它的作業。我想要做的是,使用 first.csv 中的第 6 列和 second.csv 中的第 2 列比較這兩個檔案,當它匹配時,它將輸出 first.csv 中的行。看下面的例子
第一個.csv
1,0,3210820,0,536,7855712
1,0,3523340820,0,36,53712
1,0,321023423i420,0,336,0255712
1,0,321082234324,0,66324,027312
第二個.csv
14,7855712,Whie,Black
124,7855712,Green,Black
174,1197,Black,Orange
1284,98132197,Yellow,purple
35384,9811123197,purple,purple
13354,0981123131197,green,green
183434,0811912313127,white,green
輸出應該來自第一個檔案:
1,0,3210820,0,536,7855712
我一直在使用下面的代碼。
cat first.csv | while read line
do
cat second.csv | grep $line > output_file
done
請幫忙。謝謝
uj5u.com熱心網友回復:
你的問題并不完全清楚,但這是我認為你想要的:
cat first.csv | while read LINE; do
VAL=`echo "$LINE" | cut -d, -f6`
grep -q "$VAL" second.csv && echo $LINE
done
回圈中的第一行從該行中提取第 6 個欄位并將其存盤在 VAL 中。下一行檢查(悄悄地)是否 VAL 出現在 second.csv 中,如果是,則輸出該行。
請注意,grep 將檢查 second.csv 中的任何出現,而不僅僅是在欄位 2 中。要僅檢查欄位 2,請將其更改為:
cut -d, -f2 second.csv | grep -q "$VAL" && echo $LINE
與您的問題無關,我想評論一下,這些事情可以用像 python 這樣的語言來解決,效率更高。
uj5u.com熱心網友回復:
好吧...如果您有帶有行程替換的 bash,您可以將其中的所有第二個欄位second.csv($在行尾附加一個以錨定搜索)作為檔案的輸入。然后使用grep -f第二列中的匹配資料second.csv與行尾first.csv進行您想要的操作。
您可以使用該<(process)表單將第二個欄位重定向為檔案:
grep -f <(awk -F, '{print $2"$"}' second.csv) first.csv
示例輸出
使用您顯示的資料first.csv,second.csv您將獲得:
1,0,3210820,0,536,7855712
將"$"錨作為第二個欄位的一部分添加second.csv應該只滿足第 6 個欄位(行尾)中的匹配first.csv。
這里的好處只是對 and 的一次呼叫,grep而awk不是每次迭代產生的額外子shell。對于像您的樣本輸入這樣的小檔案無關緊要,但對于數百萬行,我們正在談論數小時(或數天)的處理時間差異。
uj5u.com熱心網友回復:
rq( https://github.com/fuyuncat/rquery/releases ) 可以完美地做到這一點。
它可以像 SQL 一樣加入比較多個檔案的內容。
[ rquery]$ ./rq -q "p d/,/ | m @2 where @fileid=1 | s @raw | f @fileid=2 and @6=@r[1][1]" samples/second.csv samples/first.csv
1,0,3210820,0,536,7855712
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/521133.html
標籤:linux重击壳
