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