perl unix sed awk

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.