Разделение имен, разделенных символом «| характер "для отдельных пар

Я хочу разделить имена в одной строке на отдельные отдельные пары.

TMPRSS2|pp9284 AADAT Sample1 ERG TMPRSS2|pp9284 Sample2 TMPRSS2|pp9284 ETV1 Sample3 PDE4A MIA|MIA-RAB4B|RAB4B|RAB4B-EGLN2|EGLN2 Sample4 

Это должно быть

 TMPRSS2 AADAT Sample1 pp9284 AADAT Sample1 ERG TMPRSS2 Sample2 ERG pp9284 Sample2 TMPRSS2 ETV1 Sample3 pp9284 ETV1 Sample3 PDE4A MIA Sample4 PDE4A MIA-RAB4B Sample4 PDE4A RAB4B Sample4 PDE4A RAB4B-EGLN2 Sample4 PDE4A EGLN2 Sample4 

Несколько имен находятся в обоих столбцах, поэтому я хочу отдельные пары. Я пробовал mysql для этого, поскольку после того, как у меня есть отдельные пары, я хочу сравнить его с другой таблицей. strsplit в R работает только хорошо, когда несколько имен имеют фиксированное число. Но они меняются в каждой строке. Могу ли я сделать это с помощью sed, awk?

Также есть определенные столбцы, значения которых остаются такими же и в основном они остаются одинаковыми для значений, которые были в одной строке. Как я должен их распечатать. Я добавил третий столбец, значения которого будут реплицироваться в новые строки. Для этого я использовал напечатайте $ 3 внутри цикла for, чтобы распечатать их, но dos не работает.

  • Сопоставьте два слова, которые находятся на одной строке
  • Извлечь текст, включая parens
  • Как получить все строки между первым и последним вхождениями шаблонов?
  • Печать текста между двумя шаблонами, не содержащими конкретного слова
  • Как заменить путь в файле новым путем с помощью sed?
  • Как извлечь несколько строк, разделенных запятой из файла журнала?
  • Удалить строку, содержащую первое появление «pattern1» после последнего появления «pattern2»?
  • Дополнение с 'sed'
  • 3 Solutions collect form web for “Разделение имен, разделенных символом «| характер "для отдельных пар”

     $ awk '{split($1,a,"|"); split($2,b,"|"); for (i in a) {for (j in b) print a[i],b[j];}}' file TMPRSS2 AADAT pp9284 AADAT ERG TMPRSS2 ERG pp9284 TMPRSS2 ETV1 pp9284 ETV1 PDE4A RAB4B-EGLN2 PDE4A EGLN2 PDE4A MIA PDE4A MIA-RAB4B PDE4A RAB4B 

    Чтобы также напечатать третье ( SampleN ) поле, вы можете просто добавить $3 в оператор печати внутри циклов, т. SampleN

     $ awk '{split($1,a,"|"); split($2,b,"|"); for (i in a) {for (j in b) print a[i],b[j],$3;}}' file TMPRSS2 AADAT Sample1 pp9284 AADAT Sample1 ERG TMPRSS2 Sample2 ERG pp9284 Sample2 TMPRSS2 ETV1 Sample3 pp9284 ETV1 Sample3 PDE4A RAB4B-EGLN2 Sample4 PDE4A EGLN2 Sample4 PDE4A MIA Sample4 PDE4A MIA-RAB4B Sample4 PDE4A RAB4B Sample4 

    С bash:

     # important to use parentheses, not braces, to localize changes to IFS # the variable is purposefully unquoted split_pipe() ( IFS='|'; echo $1 ) while read -r first second third; do for word1 in $(split_pipe "$first"); do for word2 in $(split_pipe "$second"); do echo $word1 $word2 $third done done done < file 

    С помощью GNU sed вы можете:

     sed -E 's/(\|[^ |]+) /\1| / s/(([^|]* )?([^|]*))\|(([^ ]*)(.*))/\1\6\n\2\4/ /\n/P;D' <infile 

    … который печатает …

     TMPRSS2 AADAT Sample1 pp9284 AADAT Sample1 ERG TMPRSS2 Sample2 ERG pp9284 Sample2 TMPRSS2 ETV1 Sample3 pp9284 ETV1 Sample3 PDE4A MIA Sample4 PDE4A MIA-RAB4B Sample4 PDE4A RAB4B Sample4 PDE4A RAB4B-EGLN2 Sample4 PDE4A EGLN2 Sample4 

    Он работает, разделяя и распечатывая, затем удаляя по частям содержимое строки на дополнительных \n электронных символах. Команда P P обрабатывается только до первого встречающегося \n ewline в пространстве шаблонов, поэтому вы можете довольно легко печатать только часть своего буфера редактирования по своему усмотрению.

    В этом случае для каждого разделенного на трубы раздела, который не содержит пробелов, sed дважды помещает все биты в обоих концах буфера редактирования. sed вставляет крайний левый и правый край влево и вправо от самой левой секции, разделенной по трубам, и следует за этой последовательностью с \n ewline, затем он ставит те же самые варианты на любой конец разделенных на трубы разделов, которые остаются в правой части введенной \n строки. Таким образом, sed может P rint только бит слева, если вообще есть \n ewline в пространстве шаблонов, тогда D elete только до первого встречающегося \n ewline в пространстве шаблонов и повторите попытку.

    Самая первая замена только когда-либо случается один раз – она ​​просто присоединяет трубу к концу разделенных трубами разделов, поэтому всегда будет отделяться труба – даже для последнего случая. В остальное время sed выполняет одно из значений s/// ubstitution, P устанавливает первую строку в пространстве шаблонов, затем D eletes same. Когда он больше не сможет этого сделать, D выделяет все пространство шаблонов и автоматически втягивает в следующую строку ввода.

    POSIX BRE для того, чтобы сделать то же самое, можно было бы написать:

     sed ' s/\(|[^ |]\{1,\}\) /\1| / s/^\(\( *[^ |]* *\)*\([^ |]*\)\)|\(\([^ ]*\)\(.*\)\)/\1\6\ \2\4/; /\n/P;D' <infile 
    Interesting Posts

    Монетный двор 18.1. Целый ряд «Soliciting pool server xxx.xxx.xxx.xxx»

    tmux случайные символы, появляющиеся в терминале

    Архивировать диски проверки при загрузке

    UFW: разрешать трафик только из домена с динамическим IP-адресом

    Трудности с подключением к WLAN с помощью wpa_supplicant на системном аварийном диске

    потолочные разъемы в linux

    Установка сменного ключа для изменения языкового макета в KDE

    Как обрабатывать цикл while-do и сортировать результат с итерацией

    Возможно ли иметь xrandr в разных режимах на основе рабочего пространства?

    Почему каталог должен иметь липкий бит без исполняемого бита?

    Как вы можете зеркально отразить вывод одного терминала на другой?

    Почему «ls» спорадически выводит только «.» В корневой каталог внешнего диска?

    Почему мой чипсет BCM43142 не распознается и устройство wlan0 не найдено?

    Как найти диапазон чисел в содержимом файла и переместить файлы, содержащие диапазон чисел, в другой каталог?

    выход фьюзера выглядит двусмысленным

    Linux и Unix - лучшая ОС в мире.