Com o% GNUsed
, você pode fazer:
sed -E 's/(\|[^ |]+) /| /
s/(([^|]* )?([^|]*))\|(([^ ]*)(.*))/\n/
/\n/P;D' <infile
... que imprime ...
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
Funciona dividindo e imprimindo e excluindo em partes o conteúdo de uma linha em caracteres extra de \n
ewline. O P
command P
rints vai até o primeiro \n
ewline no espaço padrão, então você pode facilmente imprimir apenas uma parte do seu buffer de edição como quiser.
Neste caso, para cada seção dividida por pipe que não contém espaços sed
coloca todos os bits em qualquer extremidade do buffer de edição em duas vezes. sed
insere as extremidades mais à esquerda e mais à direita à esquerda e à direita da seção dividida por pipe mais à esquerda e segue essa sequência com uma \n
ewline, em seguida, coloca as mesmas seleções em qualquer extremidade de todas as divisões pipe seções que permanecem no lado direito do seu \n
ewline inserido. Portanto, sed
can P
rint apenas o bit à esquerda se houver um \n
ewline no padrão de espaço, então D
elete apenas até o primeiro \n
ewline em espaço padrão e tente novamente.
A primeira substituição só acontece uma vez - ela apenas anexa um pipe ao final das seções divididas por pipe, de modo que sempre haverá um pipe para separar - até mesmo para a última ocorrência. O restante do tempo, sed
faz o um s///
ubstitution, P
reimula a primeira linha no padrão de espaço, então D
elimina o mesmo. Quando não puder mais fazer isso, D
elimina todo o espaço padrão e puxa a próxima linha de entrada automaticamente.
Um POSIX BRE para fazer a mesma coisa pode ser escrito:
sed ' s/\(|[^ |]\{1,\}\) /| /
s/^\(\( *[^ |]* *\)*\([^ |]*\)\)|\(\([^ ]*\)\(.*\)\)/\
/; /\n/P;D' <infile