通过使用一列匹配多列来连接两个csv文件

时间:2013-12-26 19:52:31

标签: linux csv join awk grep

我需要使用file1中的第2列来比较来自file2的第15,17,18,19,20列。如果在file2中列出的任何一列上都匹配,我想写入一个文件,该文件包含来自file1的第2列,后面是第3列,第4列来自文件2

file1和file2都是csv文件。 file1有大约66 k行,file2有大约66,000行。

这里是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
    ...

为file2

的很长格式道歉

3 个答案:

答案 0 :(得分:1)

对于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
}

答案 1 :(得分:0)

很快,这将在Ruby或Perl中更容易完成。

但是,如果文件太大,您可以将它们都读入数组,然后使用一系列循环来查找匹配项。如果找到,请打印所需的数组索引。

如果数据集异常大(我认为您已经表明过它们),您可能需要考虑使用数据库来保存所有数据。将文件读入单独的数据库表,然后使用Ruby / Perl / Whatever处理数据并将适当的结果存储在第三个表中。

无论哪种方式,相同的逻辑都适用...从文件/ table1中获取一行,现在遍历文件/ table2,查找指定列中的任何匹配项。如果找到,请将数据复制到第三个文件/表。

答案 2 :(得分:0)

使用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