Как повторить строку для каждого значения соответствующего столбца

я не эксперт в программировании, я хочу повторить строку для всех ее соответствующих значений любую помощь

мой входной файл похож на этот

  • как изменить один столбец и добавить другие столбцы в строке awk
  • Подсветка клавиатуры Asus G53S
  • Как удалить ограничение длины от losetup -a
  • любая опция игнорировать dns-сервер ip из /etc/resolv.conf при выполнении nslookup?
  • Удалите строку из определенного поля с помощью awk / sed
  • Ошибка демона Cron: разрешение отклонено
  • pos COL1 COL2 COL3 18691441 CAG 18691572 GCG 18691620 ATG 18691716 CGC 

    я хочу, чтобы результат вроде этого

     pos COL1 18691441 COL1 C 18691441 COL2 A 18691441 COL3 G 18691572 COL1 G 18691572 COL2 C 18691572 COL3 G 18691620 COL1 A 18691620 COL2 T 18691620 COL3 G 18691716 COL1 C 18691716 COL2 G 18691716 COL3 C 

    Я пытаюсь повторить ряд, но он просто заставляет их дублировать, я использую

     while read line; do for i in {1..3}; do echo "$line"; done; done < real2.txt 

    и дает результат:

     pos COL1 COL2 COL3 18691441 CAG 18691441 CAG 18691441 CAG 18691572 GCG 18691572 GCG 18691572 GCG 18691620 ATG 18691620 ATG 18691620 ATG 18691716 CGC 18691716 CGC 18691716 CGC 

    затем я извлек pos из файла ввода 1.txt и сделаю 1_pos.txt и напишу что-то вроде этого:

      pos 18691441 18691572 18691620 18691716 for i in `cat 1_post.txt`; do x=$(grep -i "^$i" 1.txt | awk 'FNR == 1 {print $1"\t""COL1""\t"$2}' ) ; y=$(grep -i "^$i" 1.txt | awk 'FNR == 1 {print $1"\t""COL2""\t"$3}' ) ; z=$(grep -i "^$i" 1.txt | awk 'FNR == 1 {print $1"\t""COL3""\t"$4}' ) ; echo -e "$x""\n""$y""\n""$z"; done 

    это дает мне вывод с информацией о столбцах, но что, если у меня есть 405 столбцов вместо трех, я не хочу повторять строки для каждого столбца 405 раз, я пытаюсь поместить это в цикл, но это не работает, любая помощь ребятам:

     18691441 COL1 C 18691441 COL2 A 18691441 COL3 G 18691572 COL1 G 18691572 COL2 C 18691572 COL3 G 18691620 COL1 A 18691620 COL2 T 18691620 COL3 G 18691716 COL1 C 18691716 COL2 G 18691716 COL3 C 

  • Настройка тестовой пропускной способности с двумя локальными интерфейсами Ethernet
  • Потеря звука после установки вина 1.5 (+ python 2.7)?
  • Сравните два журнала по строкам и покажите различия, и если порядок слов из строки не совпадает
  • Bash: Цитирование через строку
  • Сочетание SSD + HDD в один быстрый, большой раздел?
  • Диск на клавише считывается только на каждом компьютере
  • 4 Solutions collect form web for “Как повторить строку для каждого значения соответствующего столбца”

    Как насчет:

     while read line col1 col2 col3; do if [[ "$line" = "pos" ]]; then echo "pos COL" continue fi echo "$line COL1 $col1" echo "$line COL2 $col2" echo "$line COL3 $col3" done < real2.txt 

    вывод:

     pos COL 18691441 COL1 C 18691441 COL2 A 18691441 COL3 G 18691572 COL1 G 18691572 COL2 C 18691572 COL3 G 18691620 COL1 A 18691620 COL2 T 18691620 COL3 G 18691716 COL1 C 18691716 COL2 G 18691716 COL3 C 

    awk- подход:

     awk 'BEGIN{OFS="\t";print "pos" OFS "COL1"}{if(NR==1){for(f=2;f<=NF;f++) c[f]=$f;} else{for(i=2;i<=NF;i++) print $1,c[i],$i}}' real2.txt 

    Выход:

     pos COL1 18691441 COL1 C 18691441 COL2 A 18691441 COL3 G 18691572 COL1 G 18691572 COL2 C 18691572 COL3 G 18691620 COL1 A 18691620 COL2 T 18691620 COL3 G 18691716 COL1 C 18691716 COL2 G 18691716 COL3 C 

    OFS="\t" – разделитель выходного поля

    print "pos" OFS "COL1" – печатает строку заголовка

    if(NR==1){for(f=2;f<=NF;f++) c[f]=$f; – сбор столбцов с первой строки заголовка

    for(i=2;i<=NF;i++) print $1, c[i], $i – печать каждого столбца ( COL... ) значения «rowwise» относительно соответствующего значения столбца pos и его соответствующего имени столбца.

    Не используйте оболочки для обработки текста.

    Здесь awk – это правильный инструмент для задачи. Но вам нужно только позвонить ему:

     awk -v OFS='\t' ' NR == 1 {print $1, "name", "value"; split($0, header); next} {for (i = 2; i < NF; i++) print $1, header[i], $i}' < your-file 

    (вариант ответа Романа )

     while IFS= read -rl; do read -r -a A <<<"$l" case $l in 'pos'[\ \ ]* ) echo "${A[@]:0:2}" C=("${A[@]:1}") ;; * ) p=0 x=${A[0]} for e in "${A[@]:1}"; do echo "$x ${C[$p]} $e" ((p++)) done ;; esac done < yourfile sed -E ' /\n/bloop y/\t/ /;s/ +/ /g;s/^ +//;s/ +$// 1{ h s/ /\n/2 x s/ /\n/;s/.*\n// x s/\n.*// b } G;s/\n/ &/ :loop # 1 2 3 4 5 s/^(\S+ )(\S+) (.*)(\n)(\S+) ?/\1\5 \2\4\1\3\4/ /\n$/{ /\n.*\n/!d } P /\n.*\n/D tloop ' yourfile 

    Результаты

     pos COL1 18691441 COL1 C 18691441 COL2 A 18691441 COL3 G 18691572 COL1 G 18691572 COL2 C 18691572 COL3 G 18691620 COL1 A 18691620 COL2 T 18691620 COL3 G 18691716 COL1 C 18691716 COL2 G 18691716 COL3 C 

    объяснение

    • Прежде всего, мы преобразуем любые остаточные TAB в пробелы, затем сжимаем несколько пробелов и, наконец, обрезаем любые ведущие / конечные пробелы.
    • Мы выполняем специальную обработку первой строки:
      • а) сделать копию строки.
      • б) отметьте конец 2-го столбца для последующего.
      • c) замените эту отмеченную строку копией, хранящейся в удержании.
      • d) разделите первый столбец, а затем верните назад & в этот дисплей cols1,2.
    • Для всех остальных строк (от 2 до eof) мы добавляем имена столбцов в строку.
    • Затем настройте цикл do-while while, в котором на каждой итерации мы перестраиваем поля таким образом, чтобы отображалось имя столбца вместе с его значением. Мы останавливаемся, когда видим строку с \n в конце и это единственный символ \n оставшийся в строке. В противном случае мы просто отрубаем ведущую часть и вернемся к началу цикла.
    Linux и Unix - лучшая ОС в мире.