Text-Processing
如何用文件名的數字部分替換列中的所有值(所有 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
我想做的是用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 內容