列内のすべての値 (すべて NA) をファイル名の数値部分に置き換えるにはどうすればよいでしょうか?

列内のすべての値 (すべて NA) をファイル名の数値部分に置き換えるにはどうすればよいでしょうか?

次のような名前のファイルが複数 (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接尾辞を削除する
  • awkNA3列目の数字をファイル名から抽出した数字に置き換え、それをtmpファイルに保存します。
  • 元のファイルをtmpファイルに置き換えます

ループが終了したら、tmp ディレクトリを削除します。

GAWKがあれば、-iインプレースオプションを使用できるため、tmp関連の作業はすべて回避できます。

答え2

すべてのファイルを処理する1 つのスクリプトをお勧めしますsed

sed -i 's/         NA  /          1  /' chr{1..22}.out 

関連情報