簡體   English   中英

通過使用一列匹配多個列來連接兩個csv文件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM