Объединение файлов с различной информацией о столбцах по критериям

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

Первый файл уникален из вторых двух, которые настроены таким же образом. Файл 1 выглядит так:

rs101 12 126890980 AG rs102 4 114553253 AC rs103 9 172776204 CT 

Файл 2 выглядит так:

 1 178 0.12 0.26 0.02 1 1458 0.35 0.37 0.021 1 318 0.99 0.105 0.08 

Файл 3 выглядит так:

  1 3567 0.78 0.67 0.005 0 0 0 0 0 1 3567 0.34 -0.15 0.001 

Мне нужен сценарий, который объединяет их в файлы для создания третьего файла:

 rs101 12 126890980 AG 1 178 0.12 0.26 0.02 1 3567 0.78 0.67 0.005 rs102 4 114553253 AC 1 1458 0.35 0.37 0.02 0 0 0 0 0 rs103 9 172776204 CT 1 318 0.99 0.105 0.08 1 3567 0.34 -0.15 0.001 

Проблема в том, что если эти файлы сливаются неправильно, они не будут предоставлять правильную информацию при прохождении анализа – я могу добавить уникальный столбец в конец каждого файла (например, rs # можно было дважды напечатать в файле один (один раз в первом столбце и один раз в последнем столбце), а затем соответствующий номер rs может быть добавлен в другой столбец в конце файлов 2 и 3). Затем я могу вручную установить проверку правильности слияния. Любые идеи или предложения оценены!

Один способ, используя paste :

 paste -d "\n" file1.txt file2.txt file3.txt 

Результаты:

 rs101 12 126890980 AG 1 178 0.12 0.26 0.02 1 3567 0.78 0.67 0.005 rs102 4 114553253 AC 1 1458 0.35 0.37 0.021 0 0 0 0 0 rs103 9 172776204 CT 1 318 0.99 0.105 0.08 1 3567 0.34 -0.15 0.001 

Это предполагает, что каждый из ваших входных файлов содержит одинаковое количество строк. Чтобы проверить каждый файл (и, следовательно, избежать потенциальных проблем с объединением), используйте wc :

wc -l file1.txt file2.txt file3.txt

Результаты:

 3 file1.txt 3 file2.txt 3 file3.txt 9 total 

НТН

Использование Perl в командной строке:

 perl -e ' @fh = map {open my $fh, $_; $fh} @ARGV; print map <$_>.'', @fh until grep eof, @fh; ' file1.txt file2.txt file3.txt 

Один из способов использования perl :

 perl -e ' open $fh1, q|<|, shift; open $fh2, q|<|, shift; open $fh3, q|<|, shift; while ( $l1 = <$fh1>, $l2 = <$fh2>, $l3 = <$fh3> ) { printf qq|%s|, join qq||, $l1, $l2, $l3; } ' File1 File2 File3 

Вывод:

 rs101 12 126890980 AG 1 178 0.12 0.26 0.02 1 3567 0.78 0.67 0.005 rs102 4 114553253 AC 1 1458 0.35 0.37 0.021 0 0 0 0 0 rs103 9 172776204 CT 1 318 0.99 0.105 0.08 1 3567 0.34 -0.15 0.001 

Использование дескрипторов файлов в оболочке –

 while IFS= read -r lineA && IFS= read -r lineB <&3 && IFS= read -r lineC <&4 ; do echo "$lineA"; echo "$lineB"; echo "$lineC" done <file1 3<file2 4<file3