2011-10-05 40 views
1

我想加入2个文件 - 两个文件都是CSV格式 - 两个文件都有相同的列。下面是每个文件的例子:BASH - 加入非第一列

文件1:

CustName,AccountReference,InvoiceDate,InvoiceRefID,TelNo,Rental,GPRS,Mnet,MnetPlus,SMS,CSD,IntRoaming,NetAmount 
acme,107309 ,2011-09-24 12:47:11.000,AP/157371,07741992165  ,2.3900,.0000,.0000,.0000,.0000,.0000,.0000,2.3900 
acme,107309 ,2011-09-24 12:58:32.000,AP/162874,07740992165  ,2.0000,.0000,.0000,.0000,.0000,.0000,.0000,2.0000 
anot,107308 ,2011-09-24 12:58:32.000,AP/162874,07824912428  ,2.0000,.0000,.0000,.0000,.0000,.0000,.0000,2.0000 
anot,107308 ,2011-09-24 12:47:11.000,AP/157371,07834919928  ,1.5500,.0000,.0000,.0000,.0000,.0000,.0000,1.5500 

文件2:

CustName,AccountReference,InvoiceDate,InvoiceRefID,TelNo,Rental,GPRS,Mnet,MnetPlus,SMS,CSD,IntRoaming,NetAmount 
acme,100046,2011-10-05 08:29:19,AB/020152,07824352342,12.77,0.00,0.00,0.00,0.00,0.00,0.00,12.77 
anbe,100046,2011-10-05 08:29:19,AB/020152,07741992165,2.50,0.00,0.00,0.00,0.00,0.00,0.00,2.50 
acve,100046,2011-10-05 08:29:19,AB/020152,07740992165,10.00,0.00,0.00,0.00,0.00,0.00,0.00,10.00 
asce,100046,2011-10-05 08:29:19,AB/020152,07771335702,2.50,0.00,0.00,0.00,0.00,0.00,0.00,2.50 

我想2个文件结合在一起 - 而只是采取了一些列的其他列可以忽略(有些是相同的,有些是不同的) -

AccountRef,telno, rental_file1,rental_file2,gprs_file1,gprs_file2 etc etc ...

连接应该在telno列上完成(看起来我在文件1中有空白 - 希望可以忽略?

我发现很多使用JOIN例子,但它们都使用了第一列了对连接的关键....任何指针将是巨大的 - 感谢

+0

AccountRef应该来自file1还是来自file2?每个文件的telnums是唯一的吗? –

+0

@DimitreRadoulov AccountRef应取自file1(对不起没有清楚上面),是的telno的每个文件是唯一的....感谢 – ManseUK

回答

1
awk -F' *, *' 'NR > 1 && NR == FNR { 
    _[$5] = $0; next 
    } 
NR == 1 { 
    print "AccountReference", "TelNo", "Rental_" ARGV[2], \ 
    "Rental_" ARGV[3], "GPRS_" ARGV[2], "GPRS_" ARGV[3] 
    next 
    } 
$5 in _ { 
    split(_[$5], t) 
    print $2, $5, $6, t[6], $7, t[7] 
    }' OFS=, file2 file1 
+0

绝对当场就...感谢您的时间和回答 – ManseUK

+0

@ManseUK,不客气! –

1

看一看catcut: - )

例如

cat file1 file2 | cut -d, -f2,5 

产生

107309 ,07741992165  
107309 ,07740992165  
107308 ,07824912428  
107308 ,07834919928 
100046,07824352342 
100046,07741992165 
100046,07740992165 
100046,07771335702 
+0

如何订购?我可以用猫排序吗? – ManseUK

+0

当然。这就是所有这些命令...他们可以在几乎所有的方式,你可以想到的:-) – aioobe

+0

好 - 所以说我可以通过telno命令这两个文件 - 我怎么去加入他们的专栏 - 当我说加入我的意思是不显示的重复 - 两个文件显示的列telno之一次数.... – ManseUK

2

基本答案是:

join -t , -1 3 -2 4 -1 6 -2 2 file1 file2 

这将从file与柱4从file2加入上塔3中的文件和file1file2,然后在列6和2中的数据文件必须当然,排序在那些相同的列上。 -t ,将分隔符设置为CSV - 但join不会处理带引号的字符串中的嵌入逗号。

如果你的数据很简单(没有引号的字符串),那么你也可以使用awk。如果您的数据引用了可能包含逗号等的字符串,那么您需要一个可识别CSV的工具。我可能会使用Perl与Text::CSV模块(和Text::CSV_XS模块的性能)。