Как вставлять столбцы из отдельных файлов с помощью 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
Обратите внимание: лучшее решение позволит быстро управлять большим количеством строк.
Ответы
Ответ 1
Вы были на пути с 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
Ответ 2
Другой способ сделать это - pr
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
Ответ 3
Я хотел расширить решение 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
В любом случае, это было удобно для меня и просто хотело пройти знание. Надеюсь, это поможет кому-то.
Ответ 4
Если вы просто хотите вставить отдельные столбцы разных файлов рядом,
Вы можете использовать комбинацию пасты и резки.
Например, если у вас есть три файла с одинаковыми строками, отличающимися только некоторыми столбцами, которые вы хотите объединить:
$ 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
Это почти не требует памяти и, вероятно, так быстро, как это возможно.