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*.out
archivo.
- Cree una variable para este archivo en el directorio tmp
- eliminar el
chr
prefijo - eliminar el
.out
sufijo awk
Luego reemplazará cualquieraNA
en 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 -i
opción in situ
Respuesta2
Sugiero un sed
script para manejar todos los archivos.
sed -i 's/ NA / 1 /' chr{1..22}.out