Как заменить все значения (все NA) в столбце числовой частью имени файла?

Как заменить все значения (все NA) в столбце числовой частью имени файла?

У меня есть несколько (22) файлов, которые названы следующим образом:

chr1.выход, chr2.выход...,chr22.выход

каждый из этих файлов имеет 46 столбцов и несколько строк

Первые 6 столбцов и 6 строк в одном из этих файлов выглядят так:

  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

Допустим, это файл chr1.out

Я хотел бы заменить все NA в столбце хромосома на 1.

поэтому это будет выглядеть так:

  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

Я хотел бы сделать то же самое для каждого из этих 22 файлов. Так что chr2.out получает 2 в 3-м столбце, chr3.out получает 3 в 3-м столбце и т. д.

решение1

Использование 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"

Сначала создадим каталог tmp, так как будем создавать файлы tmp.

Затем мы просматриваем каждый chr*.outфайл.

  • Создайте переменную для этого файла в каталоге tmp
  • удалить chrпрефикс
  • удалить .outсуффикс
  • awkзатем заменит все NAв третьем столбце числом, извлеченным из имени файла, и сохранит его в файле tmp
  • замените исходный файл файлом tmp

После завершения цикла мы удаляем каталог tmp.

Всех этих tmp-заморочек можно избежать, если у вас есть GAWK, который может использовать -iопцию in place.

решение2

Я предлагаю один sedскрипт для обработки всех файлов.

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

Связанный контент