es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Encontrar en Bash cuando una condición específica es verdadera utilizando sed con un delimitador diferente.

Similar a lo que se preguntó en https://stackoverflow.com/questions/20664446/bash-replace-string-where-specific-condition-is-true, quiero reemplazar una parte de una línea basado en una condición previa, pero mi delimitador debe ser diferente porque parte de lo que estoy reemplazando incluye /. La condición tampoco está en la primera columna sino en la segunda.

Por ejemplo, mi data incluye:

Location Ref Alt GT1 GT2
1_100004338 T C 0/0 0/0
1_100004339 C T 0/0 0/1
1_100004343 A G 1/1 0/0

Si quiero basarlo en si tengo una C en Ref (columna 2) y reemplazar todas las apariciones de 0/0 con 2:

Location Ref Alt GT1 GT2
1_100004338 T C 0/0 0/0
1_100004339 C T 2 0/1
1_100004343 A G 1/1 0/0

He intentado el siguiente input:

sed "+^"C"+s+"0/0"+"2"+g" archivo

y obtengo el error:

sed: -e expression #1, char 2: unknown command: `^'

No estoy seguro si incluso me habría dado lo que quería si hubiera funcionado, ya que C está en la segunda columna y no al principio de la línea. He intentado usar otras formas como awk BEGIN, que es demasiado lento para mi archivo tan grande.

Cualquier ayuda sería apreciada y gracias de antemano.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para lograr el resultado deseado, puedes utilizar el comando awk en lugar de sed. Puedes especificar el delimitador como un espacio y luego utilizar una declaración condicional para comprobar si la segunda columna tiene la letra C y, si es así, reemplazar todas las ocurrencias de 0/0 con 2 en toda la línea. Aquí hay un ejemplo de comando que debería funcionar:

    awk -F' ' '{ if($2 == "C") gsub(/0\/0/, "2"); print }' archivo
    

    Desglosando la explicación:

    • -F' ' especifica el delimitador como un espacio
    • if($2 == "C") comprueba si la segunda columna contiene la letra C
    • gsub(/0\/0/, "2") reemplaza todas las ocurrencias de 0/0 con 2 en toda la línea
    • print imprime la línea modificada

    Esto debería darle el resultado deseado para el archivo de entrada proporcionado.

Comments are closed.