Como substituir todos os valores (todos os NAs) em uma coluna pela parte numérica do nome do arquivo?

Como substituir todos os valores (todos os NAs) em uma coluna pela parte numérica do nome do arquivo?

Tenho vários (22) arquivos nomeados assim:

chr1.out, chr2.out...,chr22.out

cada um desses arquivos tem 46 colunas e múltiplas linhas

As primeiras 6 colunas e 6 linhas em um desses arquivos são assim:

  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 isso esteja no arquivo chr1.out

o que eu gostaria de fazer é substituir todos os NAs na coluna cromossomo por 1.

então ficaria assim:

  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

Eu gostaria de fazer o mesmo para cada um desses 22 arquivos. Então chr2.out obtém 2 na 3ª coluna, chr3.out obtém 3 na 3ª coluna, etc.

Responder1

Usando um 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"

Primeiro criamos um diretório tmp, pois criaremos arquivos tmp

Em seguida, percorremos cada chr*.outarquivo.

  • Crie uma variável para este arquivo no diretório tmp
  • remova o chrprefixo
  • remova o .outsufixo
  • awkirá então substituir qualquer um NAna terceira coluna pelo número extraído do nome do arquivo e salvá-lo no arquivo tmp
  • substitua o arquivo original pelo arquivo tmp

Após o término do loop, removemos o diretório tmp.

todas as coisas do tmp podem ser evitadas se você tiver o GAWK, que pode usar a -iopção in place

Responder2

Sugiro um sedscript para lidar com todos os arquivos.

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

informação relacionada