다음과 같은 이름의 파일이 여러 개 있습니다(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 디렉토리를 제거합니다.
-i
in place 옵션을 사용할 수 있는 GAWK가 있으면 모든 tmp 항목을 피할 수 있습니다.
답변2
모든 파일을 처리하려면 하나의 스크립트를 제안합니다 sed
.
sed -i 's/ NA / 1 /' chr{1..22}.out