%20%E3%82%92%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%90%8D%E3%81%AE%E6%95%B0%E5%80%A4%E9%83%A8%E5%88%86%E3%81%AB%E7%BD%AE%E3%81%8D%E6%8F%9B%E3%81%88%E3%82%8B%E3%81%AB%E3%81%AF%E3%81%A9%E3%81%86%E3%81%99%E3%82%8C%E3%81%B0%E3%82%88%E3%81%84%E3%81%A7%E3%81%97%E3%82%87%E3%81%86%E3%81%8B%3F.png)
次のような名前のファイルが複数 (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