perl -lane '$,="\t";
!@ARGV and $. == 1 and print($_, qw/Id/x2),next;
$h{$F[1],$F[2]}->[@ARGV] = $F[3];
!@ARGV and print $_, map { $h{$F[1],$F[2]}->[$_] // q/NA/ } 1..2;
$. = 0 if eof;
' file3 file2 file1
Результаты
chr start end Id Id Id
chr1 1 400 SN_1 NA NA
chr1 401 800 SN_2 SN_2 NA
chr1 801 1200 SN_3 SN_3 NA
chr1 1201 1600 SN_4 SN_4 SN_4
chr1 1601 2000 SN_5 NA SN_5
chr1 2001 2400 SN_6 NA SN_6
chr1 2401 2800 SN_7 NA NA
Работа
- Порядок ввода: dataframe3, dataframe2 и dataframe1.
- Предполагая, что все четвертые столбцы dataframe1 заполнены, IOW, ни один из них не пропущен.
- Мы вызываем
Perl
в режиме чтения строк + авторазбиения: perl -lane
- Во время чтения 3-го кадра @ARGV имеет 2 элемента, во время 2-го кадра читается в нем 1 элемент, и 0 во время 3-го кадра.
- Мы заполняем хеш,
%h
, ключами которого являются 2-е и 3-е поля, $F[1],$F[2]
, а значения являются ссылками на анонимные массивы. , отсюда и название: $h{...}[...]
.
- Во время 1-го фрейма данных (@ARGV с 0 элементами) мы печатаем каждую строку с содержимым 1-го фрейма данных и определяем, существуют ли элементы массива или нет для 2-го/3-го фреймов для соответствующие текущие 2-е/3-е поля.
lovespring
17.01.2016, 02:37
Ссылка