Bash:
while read -r f1 f2 rest; do
printf '%s' "$f1" "$(expr " $f2" : '\([^:]*:[^:]*\).*' \| " $f2")" "$rest"; echo
# the lone echo provides for the newline
done < yourfile
read
dividirá os campos em $f1
, $2
e todos os restantes serão agrupados no $rest
. Em seguida, no segundo campo, $f2
, executamos expr
para extrair os primeiros e segundos campos delimitados por dois pontos. Se isso não for possível, acabamos usando a própria variável $f2
.
Sed:
sed -e '
s/[^[:space:]]\{1,\}/\
&\
/2
:loop
s/\n\(.*:.*\):.*\n/\n\n/
tloop
s/\n//g
' yourfile
Primeiro, envolvemos o segundo campo com \n
e, em seguida, executamos um loop em torno dessa região até que restem apenas dois campos (ou um delimitador de campo).
Perl:
perl -pe 's/\G[^:\h]+:[^:\h]+\K\S+//,next while /\S\h+\S/g' yourfile
perl -pe 's/^\h*\S+\h+(?:(?!:)\S)+:(?:(?!:)\S)+\K\S+//' yourfile
perl -F'(\h+)' -lane '
/:/ and $_ = join ":", (/[^:]+/g)[0,1] for $F[/^\h/?4:2];
print @F;
' yourfile
Resultado
0 22:16050847 0 16050847
0 rs62224609:16051249 0 16051249
0 22:16051250 0 16051250
0 GSA-rs138295790 0 16057310