Tengo un archivo que se parece a esto:
xxxxxxx-000-387-159 < 50 null null_27 KCNQ1 1 1.430 0.773 0.656 1.724 xxxxxxx-000-375-285 < 50 < 50 100 - 500_0 KCNQ1 2 1.409 0.786 0.623 1.801 xxxxxxx-000-523-531 50 - 100 50 - 100 100 - 500_31 KCNQ1 3 1.326 0.848 0.479 1.557Necesito eliminar cualquier cosa (espacios y caracteres) después de los primeros 19 caracteres y antes de la letra K en KCNQ1. La salida esperada sería:
xxxxxxx-000-387-159 KCNQ1 1 1.430 0.773 0.656 1.724 xxxxxxx-000-375-285 KCNQ1 2 1.409 0.786 0.623 1.801 xxxxxxx-000-523-531 KCNQ1 3 1.326 0.848 0.479 1.557Probé con sed:
sed -e 's/...................KCNQ/ KCNQ/g' file.rpt > file_new.rptSin embargo, solo cambia la primera línea.
¿Qué estoy haciendo mal?
Suponiendo que no haya K entre los 19 primeros caracteres y KCNQ , puede usar
sed -E 's/^(.{19})[^K]*/\1/' file # If you need to make sure there is `KCNQ` string on the right: sed -E 's/^(.{19})[^K]*(KCNQ)/\1 \2/' fileVea una demostración en línea :
#!/bin/bash s='xxxxxxx-000-387-159 < 50 null null_27 KCNQ1 1 1.430 0.773 0.656 1.724 xxxxxxx-000-375-285 < 50 < 50 100 - 500_0 KCNQ1 2 1.409 0.786 0.623 1.801 xxxxxxx-000-523-531 50 - 100 50 - 100 100 - 500_31 KCNQ1 3 1.326 0.848 0.479 1.557' sed -E 's/^(.{19})[^K]*(KCNQ)/\1 \2/' <<< "$s"Producción:
xxxxxxx-000-387-159 KCNQ1 1 1.430 0.773 0.656 1.724 xxxxxxx-000-375-285 KCNQ1 2 1.409 0.786 0.623 1.801 xxxxxxx-000-523-531 KCNQ1 3 1.326 0.848 0.479 1.557 Además, si solo hay un KCNQ en la cadena, también puede usar
sed -E 's/^(.{19}).*(KCNQ)/\1 \2/' file donde [^K]* se reemplaza con .* .
Será muy simple en awk , con sus muestras mostradas, intente seguir el código.
awk '{print substr($0,1,18),substr($0,index($0,"K"))}' Input_file Explicación: la explicación simple sería imprimir subcadenas en cada línea. Ahora la cadena secundaria se basa en el requisito de OP (desde qué posición a qué posición necesitamos imprimir). En primer lugar, imprima del 1 al 18 carácter en la línea actual y luego obtenga el índice (valor de posición de la letra K ) e imprima desde esa posición en adelante hasta la última de cada línea actual en este código.