BASH - 加入非第一列

时间:2011-10-05 14:46:30

标签: bash unix grep

我正在尝试将两个文件连接在一起 - 两个文件都是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的例子,但所有这些例子都使用第一列作为连接上的键....任何指针都会很棒 - 谢谢

4 个答案:

答案 0 :(得分:2)

基本答案是:

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

这将加入file1第3列的文件file2file,第4列为file2,第6列和第2列。数据文件必须为当然,在那些列上排序。 -t ,为CSV设置了分隔符 - 但join不会处理带引号的字符串中的嵌入式逗号。

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

答案 1 :(得分: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

答案 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。