열의 모든 값(모든 NA)을 파일 이름의 숫자 부분으로 바꾸는 방법은 무엇입니까?

열의 모든 값(모든 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 파일에 있다고 가정해 보겠습니다.

제가 하고 싶은 일은 열 염색체의 모든 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접미사를 제거하다
  • awkNA그런 다음 세 번째 열의 모든 항목을 파일 이름에서 추출한 숫자로 바꾸고 이를 tmp 파일에 저장합니다.
  • 원본 파일을 tmp 파일로 교체

루프가 끝나면 tmp 디렉토리를 제거합니다.

-iin place 옵션을 사용할 수 있는 GAWK가 있으면 모든 tmp 항목을 피할 수 있습니다.

답변2

모든 파일을 처리하려면 하나의 스크립트를 제안합니다 sed.

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

관련 정보