我需要使用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
的很长格式道歉答案 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