Para o exemplo simples que você mostra onde há apenas um sublinhado e que está no segundo e no último campo, você pode fazer:
$ sed 's/_\(.*\)/& /' file | tr ' ' '\t'
2 1_123 123
2 2_345 345
Ou, se a sua implementação sed
suportar expressões regulares estendidas:
$ sed -E 's/_(.*)/& /' file | tr ' ' '\t'
2 1_123 123
2 2_345 345
Isso corresponderá ao primeiro _
e tudo depois disso. Os parênteses capturam a string combinada e podemos nos referir a ela na mão direita da substituição como
. &
é tudo o que foi correspondido, então o _
seguido pelo restante do segundo campo. A substituição, portanto, será impressa, um espaço e os caracteres após o _
. O tr
substitui todos os espaços por tabulações.
Para casos mais complexos, em que você pode ter um número arbitrário de campos e qualquer um deles pode conter _
, você pode usar perl
:
$ perl -lane 's/ +/\t/g; $F[1]=~/_(\S+)/; print "$_\t$1"' file
2 1_123 123
2 2_345 345
O -a
faz com que perl
divida sua entrada no espaço em branco na matriz @F
. O segundo campo é $F[1]
porque as matrizes começam a contar em 0
. O -n
significa "leia o arquivo de entrada linha a linha e aplique o script fornecido por -e
". O -l
remove as novas linhas à direita da linha de entrada e adiciona uma nova linha a cada chamada print
.
s/ +/\t/g;
substitui todas as ocorrências de um ou mais espaços por tabulações, $F[1]=~/_(\S+)/;
corresponde aos caracteres após o _
no segundo campo e os salva como $1
e o print "$_\t$1"
imprimirá a linha atual ( $_
) seguido pelo que quer que tenha sido correspondido.
Outra ferramenta útil para dados baseados em campo é awk
:
$ awk '{gsub(/ /,"\t");l=$2; sub(/.*_/,"",l); print $0"\t"l}' file
2 1_123 123
2 2_345 345
Em awk
, as linhas de entrada são divididas automaticamente no espaço em branco e se tornam $1
m $2
... $N
. O gsub(/ */,"\t");
substitui todos os espaços por tabulações; l=$2
salva o segundo campo como l
; sub(/.*_/,"",l);
remove tudo até e incluindo o _
de l
; e print $0"\t"l
imprime a linha ( $0
) seguida por uma tabulação e o segundo campo modificado.