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

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

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 등... Unix에서 이를 수행하는 쉬운 방법이 있습니까? 나는 MacBook Pro를 소유하고 있지만 이것에 익숙하지 않습니다. 이는 실제로 탭으로 구분된 필드가 있는 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

"마술"은 입력 파일 이름을 포함하는 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"새 파일(에 의해 생성됨)의 내용으로 이전 파일을 덮어쓰는 명령입니다 . 명령이 실패하면 오른쪽 부분은 실행되지 않으며 원본 데이터는 안전하게 유지됩니다.awkawk '' file > tmp && mv tmp fileawk&&

관련 정보