vcf 파일이 많이 있습니다
HR001.vcf
HR002.vcf
HR003.vcf
HR004.vcf
HR005.vcf
HR006.vcf
HR007.vcf
HR008.vcf
.
.
에서10번째 열각 파일의 열 헤더는 $i입니다. 각 파일에서 $i를 파일의 기본 이름으로 바꾸고 싶습니다. 예를 들어 파일 HR001.vcf, $i=HR001, HR002.vcf $i=HR002 등... 유닉스에서 이를 수행하는 간단한 방법이 있습니까? 나는 맥북 프로를 소유하고 있지만 이것에 익숙하지 않습니다. 이는 실제로 탭으로 구분된 필드가 있는 VCF 파일입니다. 예, 각 파일에는 건너뛰어야 하는 236개의 행이 있습니다. #CHROM으로 시작하는 행, 즉 행 #237에 관심이 있고 해당 행 237의 열 #10에 $i가 포함되어 있습니다.
답변1
나는 다음을 사용할 것입니다 perl
:
perl -F'\t' -i -lape '
if ($F[0] eq "#CHROM" && $F[9] eq q($i)) {
$F[9] = ($ARGV =~ s/\.vcf$//r);
$_ = join "\t", @F
}' -- *.vcf
답변2
다음과 같은 스크립트로 작업을 수행할 수 있습니다.
cd /path/to/direcrtory
for i in *.vcf
do
awk '{if (FNR==1) $10=FILENAME; print}' "$i" >"$i.tmp" && mv -f "$i.tmp" "$i"
done
"magic"은 입력 파일 이름을 포함 FILENAME
하는 변수에 있습니다.awk
답변3
답변4
파일이 공백으로 구분되어 있다고 가정하면 다음과 같이 작동합니다.
for f_name in HR[0-9]*.vcf; do
awk -v f="${f_name%.*}" 'NR == 1 {$10 = f}1' "$f_name" > "$f_name.tmp"
mv "$f_name.tmp" "$f_name"
done
디렉토리 내부를 반복하고 각 vcf
파일을 가져옵니다. 그런 다음 파일 이름에서 확장자를 제거 ${f_name%.*}
하고 에 매개변수로 전달합니다 awk
.
awk
이를 파일 이름으로 사용하여 대체를 수행합니다.메모: 파일과 동일한 디렉터리 내에서 실행해야 합니다 vcf
. 다른 경로에서 실행하려면 다음을 사용하세요.
for f_name in /some/full/path/HR[0-9]*.vcf; do
# remove the path
f="${f_name##*/}"
awk -v f="${f%.*}" 'NR == 1 {$10 = f}1' "$f_name" > "$f_name.tmp"
mv "$f_name.tmp" "$f_name"
done
파일이 공백으로 구분되지 않은 경우 수정하세요 awk FS
.
새로운 요청에 대한 편집 및 @Ed Morton 개선 사항을 기반으로 함
#CHROM으로 시작하는 행, 즉 행 #237에 관심이 있고 해당 행 237의 열 #10에 $i가 포함되어 있습니다.
for f_name in /some/full/path/HR[0-9]*.vcf; do
# remove the path
f="${f_name##*/}"
awk -F'\t' -v f="${f%.*}" 'NR == 237 {$10 = f}1' "$f_name" > "$f_name.tmp" && mv "$f_name.tmp" "$f_name"
done
($10 = f)
이 새 버전의 스크립트는 원하는 필드 와 원하는 줄에서만 파일 이름으로 교체합니다 (NR == 237)
. 매개 awk
변수는 행을 보고 필드에서 분할하는 -F\t
방법을 설정합니다 .awk
원래 스크립트를 개선한 @Ed Morton에게 다시 한 번 감사드립니다. 명령문을 볼 수 있듯이 : mv "$f_name.tmp" "$f_name"
이전 파일을 새 파일(에서 생성됨)의 내용으로 덮어쓰는 명령은 한 awk
줄로 압축됩니다. 명령이 실패하면 해당 부분이 실행되지 않으며 원본 데이터는 안전하게 유지됩니다.awk '' file > tmp && mv tmp file
awk
&&