¿Cómo reemplazar todos los valores (todos los NA) en una columna con parte numérica del nombre del archivo?

¿Cómo reemplazar todos los valores (todos los NA) en una columna con parte numérica del nombre del archivo?

Tengo varios (22) archivos con nombres así:

chr1.salida, chr2.salida...,chr22.salida

cada uno de esos archivos tiene 46 columnas y varias líneas

Las primeras 6 columnas y 6 filas de uno de esos archivos se ven así:

  alternate_ids      rsid chromosome position alleleA alleleB index
     rs4814683 rs4814683         NA     9795       G       T     1
     rs6076506 rs6076506         NA    11231       T       G     2
     rs6139074 rs6139074         NA    11244       A       C     3
     rs1418258 rs1418258         NA    11799       C       T     4
     rs7274499 rs7274499         NA    12150       C       A     5
     rs6116610 rs6116610         NA    12934       G       A     6

Digamos que esto está en el archivo chr1.out

Lo que me gustaría hacer es reemplazar todos los NA en la columna del cromosoma por 1.

entonces quedaría así:

  alternate_ids      rsid chromosome position alleleA alleleB index
     rs4814683 rs4814683         1     9795       G       T     1
     rs6076506 rs6076506         1    11231       T       G     2
     rs6139074 rs6139074         1    11244       A       C     3
     rs1418258 rs1418258         1    11799       C       T     4
     rs7274499 rs7274499         1    12150       C       A     5
     rs6116610 rs6116610         1    12934       G       A     6

Me gustaría hacer lo mismo con cada uno de esos 22 archivos. Entonces chr2.out obtiene 2 en la tercera columna, chr3.out obtiene 3 en la tercera columna, etc.

Respuesta1

Usando un script bash:

#!/bin/bash

tmp_d=$(mktemp -q -d -t 'replace.XXXXX' || mktemp -q -d)

for f in chr*.out; do
    tmp_f="${tmp_d}/$f"
    n="${f#chr}"
    n="${n%.out}"
    awk -v n="$n" '$3 == "NA" { $3=n }1' "$f" > "$tmp_f"
    mv "$tmp_f" "$f"
done

rm -r "$tmp_d"

Primero creamos un directorio tmp ya que crearemos archivos tmp

Luego recorremos cada chr*.outarchivo.

  • Cree una variable para este archivo en el directorio tmp
  • eliminar el chrprefijo
  • eliminar el .outsufijo
  • awkLuego reemplazará cualquiera NAen la tercera columna con el número extraído del nombre del archivo y lo guardará en el archivo tmp.
  • reemplazar el archivo original con el archivo tmp

Una vez finalizado el ciclo, eliminamos el directorio tmp.

todas las cosas de tmp se pueden evitar si tienes GAWK que puede usar la -iopción in situ

Respuesta2

Sugiero un sedscript para manejar todos los archivos.

sed -i 's/         NA  /          1  /' chr{1..22}.out 

información relacionada