perl - Encuentra el número y elimina los caracteres adyacentes igual a este número
unix sed (4)
Con perl
:
perl -pe ''s//d+([^/d/s])/1*//g''
Parte de mi salida de 4 columnas se ve así:
5 cc1kcc1kc 5 cc1kcc1kc
5 cc2ppggg 5 cc2ppggg
6 ccg12qqqqqqqqqqqqggg 10 ccccg11qqqqqqqqqqqggggg
3 4qqqqcgc1q 12 cgccgccgccgc
Solo quiero que cambien las columnas segunda y cuarta, ¿hay alguna manera con awk / sed para eliminar los números con los personajes que están a su lado? ¿O sería más fácil / mejor usar un script de Perl para realizar esta transformación?
El resultado resultante debería verse así:
5 ccccc 5 ccccc
5 ccggg 5 ccggg
6 ccgggg 10 ccccgggggg
3 cgc 12 cgccgccgccgc
Tomando la pregunta literalmente, esto elimina los siguientes n caracteres de los campos 2 y 4 para cualquier n incrustado en el campo.
perl -lane ''for $i (1, 3) {@nums = $F[$i] =~ /(/d+)/g; for $num (@nums) {$F[$i] =~ s/$num.{$num}//}}; print join("/t", @F)''
Las otras respuestas eliminan el número y todos los personajes que siguen son iguales.
Para ilustrar la diferencia entre mi respuesta y las demás, use la siguiente entrada:
6 ccg8qqqqqqqqqqqqggg 10 ccccg3qqqqqqqqqqqggggg
Mi versión muestra esto:
6 ccgqqqqggg 10 ccccgqqqqqqqqggggg
mientras que el suyo produce esto:
6 ccgggg 10 ccccgggggg
Esto podría funcionar para usted (GNU sed):
sed ''h;s//S*/s*/(/S*/).*//1/;:a;s/[^0-9]*/([0-9]/+/).*/sed "s|/1.//{/1//}||" <<<"&"/e;ta;H;g;//n.*/n/bb;s//(/S*/s*/)/{3/}/(/S*/).*//2/;ba;:b;s/^/(/S*/s*/)/(/S*/)/([^/n]*/)/n/(/S*/)//1/4/3/;s//(/S*/s*/)/n/(.*/)//2/'' file
Con sed:
sed ''s/[0-9]/+/([a-z]/)/1*//g''
El partido encuentra cualquier cadena de dígitos ( [0-9]+
) seguido de cualquier letra ( [az]
). El /1*
coincide con cualquier aparición posterior de ese carácter. El modificador /g
(global) se asegura de que el reemplazo se realice más de una vez por línea.