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

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

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

  • временная установка пути в файле «init»
  • деградированная загрузка программного обеспечения
  • Должен ли LC_ALL = fr_FR.UTF-8 date +% x 'давать согласованные результаты по всем машинам?
  • Как показать сетевые адаптеры со своей статистикой?
  • switch_root дает неверный аргумент
  • Как изменить положение пусковой установки единства в Ubuntu?
  • 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.

    Спасибо.

  • Интерфейс «iwlist» -> не поддерживает сканирование (Ubuntu LTS 10.04)
  • Передача вывода команды другому в одну строку
  • Элементарная ОС: случайно установленный экран входа в Ubuntu
  • / usr / bin / время программы C с ввода-вывода не дает результатов
  • Что такое xcalib-экран для монитора HDMI?
  • Альтернатива Webmin, которая устанавливает и запускает клиентскую машину и обменивается данными через SSH
  • 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 - лучшая ОС в мире.