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*.out
arquivo.
- Crie uma variável para este arquivo no diretório tmp
- remova o
chr
prefixo - remova o
.out
sufixo awk
irá então substituir qualquer umNA
na 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 -i
opção in place
Responder2
Sugiro um sed
script para lidar com todos os arquivos.
sed -i 's/ NA / 1 /' chr{1..22}.out