열의 모든 값(모든 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접미사 제거
  • awk그런 다음 NA세 번째 열에 있는 내용을 파일 이름에서 추출한 숫자로 바꾸고 이를 tmp 파일에 저장합니다.
  • 원본 파일을 tmp 파일로 교체

루프가 완료되면 tmp 디렉터리를 삭제합니다.

-iGAWK가 있고 내부 옵션을 사용할 수 있으면 모든 tmp 항목을 피할 수 있습니다.

답변2

모든 파일을 처리하려면 스크립트를 사용하는 것이 좋습니다 sed.

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

관련 정보