[英]join two csv files by using one column matching multiple columns
我需要使用file1中的第2列與file2中的第15、17、18、19、20列進行比較。 如果從file2列出的任一列中有匹配項,我想寫入文件中有file1的第2列,然后是文件2的第3列,第4列的文件
file1和file2都是csv文件。 file1大約有66 k行,file2大約有6600萬行。
這是file1的示例行
head,user1,12345
head,user2,52412
head,user1,83712
file2的示例行
row1:bla1,bla2,row1foo,row1bar,bla5,bla6,bla7,bla8,bla9,bla10,bla11,bla12,bla13,bla14,user1, , , , , ,
row2:bla1,bla2,row2foo,row2bar,bla5,bla6,bla7,bla8,bla9,bla10,bla11,bla12,bla13,bla14, , , , , user2 , , \n
row3: bla1,bla2,row3foo,row3bar,bla5,bla6,bla7,bla8,bla9,bla10,bla11,bla12,bla13,bla14,user3, , , , , , \n
row4:bla1,bla2,row4foo,row4bar,bla5,bla6,bla7,bla8,bla9,bla10,bla11,bla12,bla13,bla14, , , , , , user9, \n
row5:bla1,bla2,row5foo,row5bar,bla5,bla6,bla7,bla8,bla9,bla10,bla11,bla12,bla13,bla14,user1, , , , ,user1, \n
我想看的結果是:
...
user1,row1foo,row1bar\n
user2,row2foo,row2bar\n
user1,row5foo,row5bar\n
...
對於文件2的超長格式表示歉意
對於Gnu Awk版本4,您可以使用FPAT
讀取CSV數據。 您可以嘗試以下方法:
gawk -f cmp.awk file1 file2 > file3
cmp.awk
在哪里
BEGIN {
FPAT = "([^,]*)|(\"[^\"]+\")"
OFS=","
}
NR==FNR {
if (NF>1) a[$2]++
next
}
{
for (i in a)
if ($15==i || $17==i || $18==i || $19==i || $20==i)
print i,$3,$4
}
很快,這將在Ruby或Perl中更容易完成。
但是,如果文件不是太大,則可以將它們都讀入數組,然后使用一系列循環查找匹配項。 如果找到任何內容,請打印所需的數組索引。
如果數據集非常大(我認為您已經指出了),則可能要考慮使用數據庫來保存所有數據。 將文件讀取到單獨的數據庫表中,然后使用Ruby / Perl / Whatever處理數據並將適當的結果存儲在第三個表中。
無論哪種方式,都將應用相同的邏輯...從file / table1抓一行,現在遍歷file / table2在指定列中查找任何匹配項。 如果找到一個,則將數據復制到第三個文件/表。
使用awk
awk -F , 'NR==FNR{a[$2];next} # Read file1 column 2 into array a.
{ for (i=15;i<=20;i++)
{ gsub(/^ *| *$/,"",$i) # Remove useless blank space
if (i!=16&&$i in a) # compare option #1, not column 16, option #2, $i column is found in array a,
print $i FS $3 FS $4
}
}' file1 file2
結果
user1,row1foo,row1bar
user2,row2foo,row2bar
user1,row5foo,row5bar
user1,row5foo,row5bar
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.