Преобразование матрицы с размером (nxn) в матрицу с комбинацией столбца строки *

Думаю, это будет лучше.

У меня есть эта структура матрицы (файла):

File1

____ snp1 snp2 snp3 snp4 snp1 1 0.3 0.4 0.5 snp2 0.3 1 0.4 0.5 snp3 0.4 0.4 1 0.5 snp4 0.5 0.5 0.5 1 

Я хотел преобразовать этот File1 в File2 :

 snp1 snp1 1 snp1 snp2 0.3 snp1 snp3 0.4 snp1 snp4 0.5 snp2 snp2 1 snp2 snp3 0.4 snp2 snp4 0.5 snp3 snp3 1 snp3 snp4 0.5 snp4 snp4 1 

Надеюсь, я был понятен, но я не знаю другой формы, чтобы спросить. В моем реальном файле больше файла file1.

Спасибо.

3 Solutions collect form web for “Преобразование матрицы с размером (nxn) в матрицу с комбинацией столбца строки *”

Чтобы напечатать только верхние треугольные значения в соответствии с вашим желаемым выходом

 awk ' NR==1 { split($0,hdr," "); next } { for (i=NR;i<=NF;i++) {print $1 FS hdr[i] FS $i} } ' file snp1 snp1 1 snp1 snp2 0.3 snp1 snp3 0.4 snp1 snp4 0.5 snp2 snp2 1 snp2 snp3 0.4 snp2 snp4 0.5 snp3 snp3 1 snp3 snp4 0.5 snp4 snp4 1 

или, что то же самое, с perl

 perl -alne ' if ($. == 1) { @hdr = @F; } else { for $i ($.-1 .. $#F) { print join " ", $F[0], $hdr[$i], @F[$i]; } }' file 

Если вам нужна полная матрица вместо верхнего треугольника, измените начальный индекс цикла for , заменив NR (в awk-версии) на 2 или $.-1 (в версии perl) на 1

ОБНОВИТЬ

Теперь никаких ограничений.

 #!/bin/bash INPUT=File1 declare -a fields fields=( $(head -n1 "$INPUT") ) i=0 while read -r line; do values=( $line ) for ((j=++i; j<${#values[@]}; j++)); do echo -e "${fields[$i]}" "${fields[$j]}"'\t'"${values[$j]}" done done < <( tail -n+2 "$INPUT") 

Это должно быть легко с помощью awk .

 $ awk -f script.awk file1.txt snp1 snp1 1 snp1 snp2 0.3 snp1 snp3 0.4 snp1 snp4 0.5 snp2 snp1 0.3 snp2 snp2 1 snp2 snp3 0.4 snp2 snp4 0.5 snp3 snp1 0.4 snp3 snp2 0.4 snp3 snp3 1 snp3 snp4 0.5 snp4 snp1 0.5 snp4 snp2 0.5 snp4 snp3 0.5 snp4 snp4 1 

Содержание script.awk . Мы пропустим первую строку и отформатируем остальные по желанию.

 $ cat script.awk { if (NR == 1) next; print $1" snp1 "$2; print $1" snp2 "$3; print $1" snp3 "$4; print $1" snp4 "$5; } 

Содержание file1.txt

 $ cat test.txt ____ snp1 snp2 snp3 snp4 snp1 1 0.3 0.4 0.5 snp2 0.3 1 0.4 0.5 snp3 0.4 0.4 1 0.5 snp4 0.5 0.5 0.5 1 

Вы можете перенаправить вывод в новый файл.

 awk -f script.awk file1.txt > file2.txt 
  • Как загрузить файл с сервера aws с помощью SSH?
  • Gnome-терминал медленно запускается с запуска, быстро при запуске с терминала
  • Понимание прав на домашнюю папку
  • Google Chrome перестает работать и не открывается
  • Очень медленная загрузка после установки Kali Linux вместе с Ubuntu и Windows
  • Почему все мои DNS-запросы разрешают 192.168.1.251?
  • Динамическое имя файла не работает в rsyslog
  • Моя система постоянно загружает и загружает с той же скоростью. Что это значит?
  • Как я могу контролировать использование ЦП пользователем?
  • Как начать телефонный звонок с терминала в телефоне Ubuntu?
  • есть ли инструмент аудита для отслеживания инсталляций пакетов и версии ядра
  • Как заменить (беззнаковый) загрузчик в Debian на один из Ubuntu, чтобы сделать его загрузочным устройством с защищенной загрузкой?
  • Linux и Unix - лучшая ОС в мире.