Преобразование матрицы с размером (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.

Спасибо.

  • Невозможно рекурсивно
  • Сосредоточение текущего окна и минимизация всех остальных
  • dnsmasq недоступен из сетевого пространства имен сначала
  • Какой хороший текстовый редактор с поддержкой RTL (справа налево)?
  • Альтернатива Webmin, которая устанавливает и запускает клиентскую машину и обменивается данными через SSH
  • Как автоматически получить новый сервер имен в VPN-подключении
  • Как определить, компактен ли диск или стандартный жесткий диск
  • Сервер SSH на Ubuntu не работает
  • 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 
    Linux и Unix - лучшая ОС в мире.