주어진 열의 헤더를 파일 이름으로 바꿉니다.

주어진 열의 헤더를 파일 이름으로 바꿉니다.

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

여기에 이미지 설명을 입력하세요@YetAnotherUser, 내 요청에 관한 샘플 파일 이미지를 참조하세요. "주어진 열의 헤더를 파일 이름으로 바꾸기"

답변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 fileawk&&

관련 정보