У меня есть несколько (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