2014-09-13 4 views
0

Я пытаюсь объединить несколько файлов с похожим синтаксисом, как показано ниже. На данный момент я экспериментировал только с двумя файлами. Файлы всегда будут иметь одинаковое количество строк, одну и ту же дату, одно и то же время и сортироваться в том же порядке. Единственное различие должно быть в поле значений.Использование команды объединения UNIX для объединения двух файлов

File1.csv

date,time,value,status 
2014/09/10,22:47:25,-0.0000000003542,9 
2014/09/10,23:14:25,-0.0000000002892,9 
2014/09/10,23:23:46,0.0000000005406,9 
2014/09/10,23:41:48,-0.0000000000142,9 
2014/09/11,00:18:40,-0.0000000009977,9 

File2.csv

date,time,value,status 
2014/09/10,22:47:25,0.0000000725578,9 
2014/09/10,23:14:25,-0.0000000283722,9 
2014/09/10,23:23:46,-0.0000000368988,9 
2014/09/10,23:41:48,-0.0000000675033,9 
2014/09/11,00:18:40,-0.0000000774759,9 

Желаемая выход

date,time,value,value 
2014/09/10,22:47:25,-0.0000000003542,0.0000000725578 
2014/09/10,23:14:25,-0.0000000002892,-0.0000000283722 
2014/09/10,23:23:46,0.0000000005406,-0.0000000368988 
2014/09/10,23:41:48,-0.0000000000142,-0.0000000675033 
2014/09/11,00:18:40,-0.0000000009977,-0.0000000774759 

Я не в том чтобы сохранить значение статуса в объединенных результатах. Я пробовал несколько вариантов команды присоединиться с последним существом:

join -t, -a 1 -a 2 -o 1.1 1.2 1.3 2.3 File1.csv File2.csv 

К сожалению, я получаю результат, подобный ниже, где он не показывает данные из File1.csv на всех.

Выходной ток

date,time,value,value 
,,,0.0000000725578 
,,,-0.0000000283722 
,,,-0.0000000368988 
,,,-0.0000000675033 
,,,-0.0000000774759 
,,,0.0000001042118 

Кто-нибудь есть какие-либо предложения?

Спасибо.


UPDATE

Как следить за этим, я вернулся и обновил входные файлы объединить даты и времени в одном поле, как показано ниже.

File1.csv

дата_время, значение, состояние
2014/09/10 22: 47: 25, -0.0000000003542,9
2014/09/10 23:14:25, -0.0000000002892,9
2014/09/10 23: 23: 46,0.0000000005406,9
2014/09/10 23: 41: 48, -0.0000000000142,9
2014/09/11 00:18:40, -0.0000000009977,9

File2.csv

дата_время, значение, состояние
2014/09/10 22: 47: 25,0.0000000725578,9
2014/09/10 23: 14: 25, -0,0000000283722 , 9
2014/09/10 23: 23: 46, -0.0000000368988,9
2014/09/10 23: 41: 48, -0.0000000675033,9
2014/09/11 00: 18: 40, - 0.0000000774759,9

Как таковой, я обновил команду присоединиться к выглядеть следующим образом:

присоединиться к -t, -a 1 -a 2 -o "1.1 1,2 2,2" File1. csv File2.csv

К сожалению, я все еще получаю вывод, который, кажется, опускает содержимое файла File1.csv.

Выходной ток

date_time, значение, значение
,, +0,0000000725578
,, - +0,0000000283722
,, - +0,0000000368988
,, - +0,0000000675033
,, - 0,0000000774759


ОБНОВЛЕНИЕ

Кажется, что проблема связана с заголовком в каждом файле. Если удалить заголовок из файлов, а затем попробуйте следующее присоединиться строку:

присоединиться к -t, -a 1 -a 2 -о «1,1 1,2 2,2» File1.csv File2.csv

Это дает следующий результат: желаемый

2014/09/10 22: 47: 25, -0.0000000003542,0.0000000725578
2014/09/10 23: 14: 25, -0,0000000002892, -0,0000000283722
2014/09/10 23: 23: 46,0.0000000005406, -0.0000000368988
2014/09/10 23: 41: 48, -0,0000000000142, -0,0000000675033
2014/09/11 00: 18: 40, -0,0000000009977, -0,0000000774759

Кто-нибудь знает способ сделать join игнорировать заголовок для входных файлов?

Спасибо,

+0

Кажется, вам лучше сделать это в скрипте, чтобы вы могли проверить, действительно ли первые три столбца действительно равны, а затем присоединиться. – user3885927

+1

'join' может присоединяться только к одному полю и по умолчанию относится к первому полю. У вас несколько строк с одинаковой датой, так что это не сработает. – Barmar

ответ

0

AWK один вкладыш без испытаний:

awk -F, -v OFS="," '{k=$1 FS $2}NR==FNR{a[k]=$3;next} 
           k in a{print k,a[k],$3}' file1 file2 
+0

К сожалению, при попытке этого я получаю следующее. awk: синтаксическая ошибка рядом с строкой 1 –

+0

@TrinityEllis Я только что прошел тест с использованием выше одного лайнера, он дал точно ожидаемый результат. – Kent

+0

Хм. Что такое разделитель между «}» и «k» в вашем одном вкладыше? Изображение выше появляется на двух строках для меня. Когда я пытаюсь запустить как одну строку с пробелом в качестве разделителя, это когда я получаю синтаксическую ошибку awk. –

0

Вы должны поместить все характеристики выходных полей в одном аргументе, так что вы должны процитировать:

join -t, -a 1 -a 2 -o "1.1 1.2 1.3 2.3" File1.csv File2.csv 

Однако это не приведет к выходу, который вы хотите. join присоединяется к одному ключевому полю, которое по умолчанию относится к первому полю.Поскольку у вас есть та же дата в нескольких строках, все они получают соединены вместе, и результат:

date,time,value,value 
2014/09/10,22:47:25,-0.0000000003542,0.0000000725578 
2014/09/10,22:47:25,-0.0000000003542,-0.0000000283722 
2014/09/10,22:47:25,-0.0000000003542,-0.0000000368988 
2014/09/10,22:47:25,-0.0000000003542,-0.0000000675033 
2014/09/10,23:14:25,-0.0000000002892,0.0000000725578 
2014/09/10,23:14:25,-0.0000000002892,-0.0000000283722 
2014/09/10,23:14:25,-0.0000000002892,-0.0000000368988 
2014/09/10,23:14:25,-0.0000000002892,-0.0000000675033 
2014/09/10,23:23:46,0.0000000005406,0.0000000725578 
2014/09/10,23:23:46,0.0000000005406,-0.0000000283722 
2014/09/10,23:23:46,0.0000000005406,-0.0000000368988 
2014/09/10,23:23:46,0.0000000005406,-0.0000000675033 
2014/09/10,23:41:48,-0.0000000000142,0.0000000725578 
2014/09/10,23:41:48,-0.0000000000142,-0.0000000283722 
2014/09/10,23:41:48,-0.0000000000142,-0.0000000368988 
2014/09/10,23:41:48,-0.0000000000142,-0.0000000675033 
2014/09/11,00:18:40,-0.0000000009977,-0.0000000774759 

Вместо этого, вы можете присоединиться на time полях:

join -1 2 -2 2 -t, -a 1 -a 2 -o "1.1 1.2 1.3 2.3" File1.csv File2.csv 

Это работает, потому что она требует линии, подлежащие сортировке. Поэтому, если есть дублирующее время, это будет не по порядку и не будет соответствовать линии с предыдущего дня.

+0

Спасибо. Я рассматривал возможность слияния даты и времени с одним значением поля, но я собирался сделать это после определения объединения. Похоже, я должен сейчас взглянуть на этот вариант, который, я считаю, могу сделать с sed. –

+0

Хм. Я все еще получаю тот же результат, что и выше, когда я пробовал соединение на основе полей времени. –

Смежные вопросы