如何用文件名的数字部分替换列中的所有值(所有 NA)?

如何用文件名的数字部分替换列中的所有值(所有 NA)?

我有多个 (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 中

我想做的是将列染色体中的所有 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, chr3.out 在第三列中得到 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 目录。

-i如果你有 GAWK 可以使用就地选项,那么所有 tmp 的东西都可以避免

答案2

我建议使用一个sed脚本来处理所有文件。

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

相关内容