Как вставить столбцы из отдельных файлов с помощью Bash?

Используя следующие данные:

$cat date1.csv
 Bob,2013-06-03T17:18:07
 James,2013-06-03T17:18:07
 Kevin,2013-06-03T17:18:07

$cat date2.csv
 2012-12-02T18:30:31
 2012-12-02T18:28:37
 2013-06-01T12:16:05

Как объединить файлы date1.csv и date2.csv? Требуемый выход:

$cat merge-date1-date2.csv
 Bob,2013-06-03T17:18:07,2012-12-02T18:30:31
 James,2013-06-03T17:18:07,2012-12-02T18:28:37
 Kevin,2013-06-03T17:18:07,2013-06-01T12:16:05

Обратите внимание: лучшее решение сможет быстро управлять огромным количеством линий.

3 ответа

Решение

Вы были на ходу с paste(1):

$ paste -d , date1.csv date2.csv 
Bob,2013-06-03T17:18:07,2012-12-02T18:30:31
James,2013-06-03T17:18:07,2012-12-02T18:28:37
Kevin,2013-06-03T17:18:07,2013-06-01T12:16:05

Из вашего вопроса немного неясно, есть ли в этих строках начальные пробелы. Если вы хотите избавиться от этого в конечном результате, вы можете использовать cut(1) отрезать его перед вставкой:

 $ cut -c 2- date2.csv | paste -d , date1.csv -
  Bob,2013-06-03T17:18:07,2012-12-02T18:30:31
  James,2013-06-03T17:18:07,2012-12-02T18:28:37
  Kevin,2013-06-03T17:18:07,2013-06-01T12:16:05

Еще один способ сделать это с пр

pr -mts, file1 file2

Тестовое задание:

[jaypal:~/Temp] cat file1
Bob,2013-06-03T17:18:07
James,2013-06-03T17:18:07
Kevin,2013-06-03T17:18:07

[jaypal:~/Temp] cat file2
2012-12-02T18:30:31
2012-12-02T18:28:37
2013-06-01T12:16:05

[jaypal:~/Temp] pr -mts, file1 file2
Bob,2013-06-03T17:18:07,2012-12-02T18:30:31
James,2013-06-03T17:18:07,2012-12-02T18:28:37
Kevin,2013-06-03T17:18:07,2013-06-01T12:16:05

Я хотел расширить решение jaypal, поскольку столкнулся с необходимостью редактировать файлы перед объединением столбцов.

$cat date1.csv
 Bob,2013-06-03T17:18:07
 James,2013-06-03T17:18:07
 Kevin,2013-06-03T17:18:07

$cat date2.csv
 2012-12-02T18:30:31
 2012-12-02T18:28:37
 2013-06-01T12:16:05

Объединение столбца 1 из date1.csv со столбцом 1 из date2.csv можно выполнить следующим образом:

$pr -mts, <(cut -d, -f1 date1.csv) date2.csv
 Bob,2012-12-02T18:30:31
 James,2012-12-02T18:28:37
 Kevin,2013-06-01T12:16:05

При желании вы можете применить дальнейшие правки с помощью трубы:

$pr -mts, <(cut -d, -f1 date1.csv | sort) date2.csv

Во всяком случае, это было удобно для меня и просто хотел передать знания. Надеюсь, это поможет кому-то.

Если вы просто хотите вставить определенные столбцы из разных файлов рядом, вы можете использовать комбинацию вставки и вырезания.

Например, если у вас есть три файла с одинаковыми строками, которые отличаются только некоторыми столбцами, которые вы хотите объединить:

$ head file1.csv
chr1H   1   240 RLC 2   138 239 0.5774059
chr1H   641 1787    RLC 12  1135    1146    0.9904014
chr1H   2009    3436    RLC 15  1413    1427    0.9901892
chr1H   4935    6106    RLG 12  1060    1171    0.9052092
chr1H   11523   11997   RLG 4   371 474 0.7827004
chr1H   11998   12882   RLX 9   776 884 0.8778281
chr1H   20340   21529   RLC 13  1177    1189    0.9899075
chr1H   27889   36240   RLC 82  8118    8351    0.9720991
chr1H   36241   39978   RLC 36  3542    3737    0.9478191
chr1H   40384   41273   RLX 10  880 889 0.9898763

$ head file2.csv
chr1H   1   240 RLC 1   39  239 0.1631799
chr1H   641 1787    RLC 11  1049    1146    0.9153578
chr1H   2009    3436    RLC 6   594 1427    0.4162579
chr1H   4935    6106    RLG 11  995 1171    0.8497011
chr1H   11523   11997   RLG 3   275 474 0.5801688
chr1H   11998   12882   RLX 4   378 884 0.4276018
chr1H   20340   21529   RLC 11  979 1189    0.8233810
chr1H   27889   36240   RLC 74  7238    8351    0.8667225
chr1H   36241   39978   RLC 31  3047    3737    0.8153599
chr1H   40384   41273   RLX 10  880 889 0.9898763

$ head file3.csv
chr1H   1   240 RLC 2   138 239 0.5774059
chr1H   641 1787    RLC 12  1135    1146    0.9904014
chr1H   2009    3436    RLC 15  1413    1427    0.9901892
chr1H   4935    6106    RLG 12  1060    1171    0.9052092
chr1H   11523   11997   RLG 4   371 474 0.7827004
chr1H   11998   12882   RLX 9   776 884 0.8778281
chr1H   20340   21529   RLC 13  1177    1189    0.9899075
chr1H   27889   36240   RLC 82  8118    8351    0.9720991
chr1H   36241   39978   RLC 36  3542    3737    0.9478191
chr1H   40384   41273   RLX 10  880 889 0.9898763

Первые для столбцов файлов идентичны. Мы хотим сохранить их, но дополнительно вставить 8-й столбец каждого файла рядом:

$ paste file1.csv file2.csv file3.csv | cut -f 1,2,3,4,8,16,24 | head

приводит к:

chr1H   1   240 RLC 0.5774059   0.1631799   0.0000000
chr1H   641 1787    RLC 0.9904014   0.9153578   0.6448517
chr1H   2009    3436    RLC 0.9901892   0.4162579   0.2081289
chr1H   4935    6106    RLG 0.9052092   0.8497011   0.1690862
chr1H   11523   11997   RLG 0.7827004   0.5801688   0.0000000
chr1H   11998   12882   RLX 0.8778281   0.4276018   0.1119910
chr1H   20340   21529   RLC 0.9899075   0.8233810   0.1068124
chr1H   27889   36240   RLC 0.9720991   0.8667225   0.4043827
chr1H   36241   39978   RLC 0.9478191   0.8153599   0.3914905
chr1H   40384   41273   RLX 0.9898763   0.9898763   0.3217098

Это почти не требует памяти и, вероятно, работает максимально быстро.

Другие вопросы по тегам