2011-10-05 82 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模塊的性能)。