2010-09-01 2 views
4

У меня есть 3 файла csv, которые я хотел бы объединить. Каждый файл имеет 3 столбца с разделителями-запятыми.Использование sed для объединения нескольких файлов csv

File 1 has columns a,b,c 
File 2 has columns d,e,f 
File 3 has columns g,h,i 

Я хотел бы объединить 3 файлов в один файл:

a,b,c,e,f,h 

Могу ли я использовать СЭД, чтобы сделать это?

Я мог бы написать консольное приложение или скрипт достаточно легко, но я пытаюсь получить некоторые навыки sed и считаю, что это должна быть подходящая задача?

+0

Каковы ваши критерии для объединения? почему вы оставляете «d», «g», «i»? – ghostdog74

+0

Вам нужно присоединиться к определенным столбцам (возможно, возможно, a = d)? Если это так, вам нужно посмотреть на команду 'join' (одна из команд odder в юниверсе Unix). Помните, что данные должны быть отсортированы по порядку и решить, что делать, если в одном из файлов нет соответствующего значения (внешнее соединение на языке СУБД). В противном случае, если он чисто позиционный (строка 1 в файле одна идет со строкой 1 в файле 2 и 1-й строке в файле 3), то команды пасты и выреза, показанные ниже, хороши. Использование «sed» затруднено (в лучшем случае); он обрабатывает один файл за раз, а не 3 параллельно. –

ответ

9

Или просто вырезать и вставить:

paste -d ',' file[123] | cut -d ',' -f 1,2,3,5,6,8 
+0

+1, намного лучше, чем у меня :) – codaddict

+0

Спасибо! Симметрия довольно :) –

+2

+1 - но имейте в виду, что если в любом из полей данных есть запятые, все ад сломается. –

3

Вы можете сделать:

paste file[123] | sed 's/\t/,/g' | cut -d',' -f 1,2,3,5,6,8 
1
ответ

Mat Менделя хорошо идти, если не случится быть в Windows, используя Cygwin в этом случае некоторые раздражает конец характерных черт характера. Это относится к утилитам командной строки unix, в этом случае вставляем и вырезаем, используя \ n в качестве символа конца строки вместо \ r \ n, который требуется Windows.

Я не мог придумать, как изменить символ конца строки для этих utils или cygwin вообще, поэтому я с радостью смог использовать sed в конце концов.

paste -d ',' file1 file2 file3 | sed 's/\r//g' | cut -d ',' -f 1,2,3,5,6,8 | sed 's/$/\r/' 
+0

Ах да, дополнительная проблема '\ r'. Приятно видеть, что ты решил это! Вы можете использовать tr -d '\ r' вместо первой команды sed. Не поймите меня неправильно, sed потрясающий, но немного тяжелый для некоторых задач. :) –

+0

- проблема перевода строк в середине или в конце? вы можете использовать dos2unix или unix2dos, чтобы исправить это. – UpAndAdam

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