컬럼명을 추출하여 파일명 출력에 사용

컬럼명을 추출하여 파일명 출력에 사용
#chr    fivep   threep  strand  sample1 sample2 sample3 sample4 name1   name2
chrI    9442    9492    +   0   0   0   0   na  na
chrI    12584   12631   +   0   0   0   0   na  na
chrI    12584   12679   +   16  16  15  22  na  na
chrI    12584   12727   +   0   0   0   0   na  na
chrI    12632   12679   +   13  12  16  9   na  na

위 형식의 파일이 있습니다. 기본적으로 샘플1, 샘플2 등의 열인 출력 이름으로 4개의 개별 파일을 얻을 수 있도록 출력을 원합니다.

예를 들어, 제가 하고 싶은 일은 다음과 같습니다.

awk -v OFS="\t" '{print $1,$2,$3,$9":"$10,$5,$4}' > sample1.txt
awk -v OFS="\t" '{print $1,$2,$3,$9":"$10,$6,$4}' > sample2.txt
awk -v OFS="\t" '{print $1,$2,$3,$9":"$10,$7,$4}' > sample3.txt
awk -v OFS="\t" '{print $1,$2,$3,$9":"$10,$8,$4}' > sample4.txt

몇 개의 열에 대해 이 작업을 수행할 수 있지만 많은 열이 포함된 대용량 파일이 있습니다. 각 awk 문을 개별적으로 입력할 필요가 없도록 루프에서 이 작업을 수행하는 방법

답변1

for 루프( ksh93, bash, zsh)를 사용하세요.

for ((i=5;i<=8;i++)); do
  awk -v i="$i" -v OFS="\t" 'NR==1{fname=$i".txt"}{print $1,$2,$3,$9":"$10,$i,$4 > fname}' infile
done

시작 및 끝 필드는 루프에 제공됩니다 for. 출력 파일 이름은 접미사가 추가된 헤더 행에서 추출되며 .txt리디렉션은 awk.

관련 정보