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