我正在尝试将两个文件连接在一起 - 两个文件都是CSV格式 - 两个文件都有相同的列。以下是每个文件的示例:
文件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
等等......
联接应该在telno
列上完成(似乎我在文件1中有空格 - 希望可以忽略?
我发现很多使用JOIN
的例子,但所有这些例子都使用第一列作为连接上的键....任何指针都会很棒 - 谢谢
答案 0 :(得分:2)
基本答案是:
join -t , -1 3 -2 4 -1 6 -2 2 file1 file2
这将加入file1
第3列的文件file2
和file
,第4列为file2
,第6列和第2列。数据文件必须为当然,在那些列上排序。 -t ,
为CSV设置了分隔符 - 但join
不会处理带引号的字符串中的嵌入式逗号。
如果您的数据很简单(没有带引号的字符串),那么您也可以使用awk
。如果您的数据引用了可能包含逗号等的字符串,那么您需要一个支持CSV的工具。我可能会使用Perl和Text::CSV模块(以及Text::CSV_XS模块来提高性能)。
答案 1 :(得分:1)
查看cat
和cut
: - )
例如
cat file1 file2 | cut -d, -f2,5
产量
107309 ,07741992165
107309 ,07740992165
107308 ,07824912428
107308 ,07834919928
100046,07824352342
100046,07741992165
100046,07740992165
100046,07771335702
答案 2 :(得分: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
答案 3 :(得分:0)
此处记录的所有GNU实用程序:
http://www.gnu.org/s/coreutils/manual/html_node/index.html#Top
对于您的问题,请参阅cat,cut,sort,uniq和join。