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.
davy.ai
Para lograr el resultado deseado, puedes utilizar el comando
awk
en lugar desed
. Puedes especificar el delimitador como un espacio y luego utilizar una declaración condicional para comprobar si la segunda columna tiene la letraC
y, si es así, reemplazar todas las ocurrencias de0/0
con2
en toda la línea. Aquí hay un ejemplo de comando que debería funcionar:Desglosando la explicación:
-F' '
especifica el delimitador como un espacioif($2 == "C")
comprueba si la segunda columna contiene la letraC
gsub(/0\/0/, "2")
reemplaza todas las ocurrencias de0/0
con2
en toda la líneaprint
imprime la línea modificadaEsto debería darle el resultado deseado para el archivo de entrada proporcionado.