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

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

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 не работает.

  • Вставка скрипта Sed и добавление в неправильное место только в одном конкретном месте
  • Regex для соответствия и замены шаблона в файле
  • SED на Mac OS X
  • Выравнивание шаблона и удаление всей строки
  • Posix Character Устанавливает разницу между ] и ]?
  • Как добавить строку к предыдущей строке?
  • Замена строки во всех файлах, найденных grep. Не могу заставить его работать
  • Переименование нескольких файлов с помощью 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 
    Linux и Unix - лучшая ОС в мире.