次のような名前のファイルが複数 (22 個) あります。
chr1.out、chr2.out...、chr22.out
各ファイルには46列と複数行があります
これらのファイルの 1 つの最初の 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 は 3 列目に 2 を取得し、chr3.out は 3 列目に 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
3列目の数字をファイル名から抽出した数字に置き換え、それをtmpファイルに保存します。- 元のファイルをtmpファイルに置き換えます
ループが終了したら、tmp ディレクトリを削除します。
GAWKがあれば、-i
インプレースオプションを使用できるため、tmp関連の作業はすべて回避できます。
答え2
すべてのファイルを処理する1 つのスクリプトをお勧めしますsed
。
sed -i 's/ NA / 1 /' chr{1..22}.out