Text-Processing

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

  • June 11, 2019

我有多個 (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 在第三列得到 2,chr3.out 在第三列得到 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文件。

  • 在 tmp 目錄中為這個文件創建一個變數
  • 去掉chr前綴
  • 去掉.out後綴
  • awk然後將用從文件名中提取的數字替換NA第三列中的任何內容並將其保存到 tmp 文件
  • 將原始文件替換為 tmp 文件

循環完成後,我們刪除 tmp 目錄。

-i如果您有可以使用in place 選項的 GAWK,則可以避免所有 tmp 內容

引用自:https://unix.stackexchange.com/questions/523137