我有多个(22)文件的命名如下:
chr1.out,chr2.out ...,chr22.out
这些文件每个都有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中
我想做的是用1替换列染色体中的所有NA。
所以看起来像这样:
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在第3列中获得2,chr3.out在第3列中获得3等
使用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
文件。
chr
前缀.out
后缀awk
然后将NA
第三列中的任何内容替换为从文件名中提取的数字,并将其保存到tmp文件中循环完成后,我们删除tmp目录。
如果您有GAWK(可以使用-i
就地选项),则可以避免所有tmp内容
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句