BASH - присоединиться к не первой колонке - PullRequest
1 голос
/ 05 октября 2011

Я пытаюсь объединить 2 файла вместе - оба файла в формате 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 ]

2 голосов
/ 05 октября 2011

Основной ответ:

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

Это объединит файлы file1 и file2 в столбце 3 из file со столбцом 4 из file2, затем в столбцах 6 и 2Конечно, файлы данных должны быть отсортированы по тем же столбцам.-t , устанавливает разделитель для CSV - но join не будет обрабатывать встроенные запятые внутри строк в кавычках.

Если ваши данные простые (без строк в кавычках), вы также можете использовать awk.Если ваши данные содержат строки в кавычках, которые могут содержать запятые и т. Д., То вам нужен инструмент с поддержкой CSV.Вероятно, я бы использовал Perl с модулем Text :: CSV (и модулем Text :: CSV_XS для повышения производительности).

1 голос
/ 05 октября 2011
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  
1 голос
/ 05 октября 2011

Взгляните на 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
0 голосов
/ 05 октября 2011

Все утилиты GNU, задокументированные здесь:

http://www.gnu.org/s/coreutils/manual/html_node/index.html#Top

По вашей проблеме см. Cat, cut, sort, uniq и join.

...