루프를 사용하여 테이블에서 열 추출

루프를 사용하여 테이블에서 열 추출

나는 이 매트릭스를 가지고 있습니다.

#chr    st  start   PM1_r1   PM2_r1   PM3_r1   PM1_r2  PM2_r2 PM3_r2
chr1    -   10625   0   0   0   0   0   0
chr1    +   16616   0.10217712  0   0   1   0   0
chr1    -   120482  0   0   0.50105411  0   0   1
chr1    -   247355  0   0   0.50105411  0   0   1
chr1    +   535689  0.10217712  0   0   1   0   0

#삽입할 추가 열

file4=formatedFile1
file5=formatedFile2
file6=formatedFile3

이 명령으로 원하는 출력을 얻으십시오.

   awk 'BEGIN {OFS="\t"} { print $1,$2,$3,$4,$7,"'$file4'" }' file

chr1    -   10625   0   0   formatedFile1
chr1    +   16616   0.10217712  1   formatedFile1
chr1    -   120482  0   0   formatedFile1
chr1    -   247355  0   0   formatedFile1
chr1    +   535689  0.10217712  1   formatedFile1

awk 'BEGIN {OFS="\t"} { print $1,$2,$3,$5,$8,"'$file5'" }' filename 

chr1    -   10625   0   0   formatedFile2
chr1    +   16616   0   0   formatedFile2
chr1    -   120482  0   0   formatedFile2
chr1    -   247355  0   0   formatedFile2
chr1    +   535689  0   0   formatedFile2



awk 'BEGIN {OFS="\t"} { print $1,$2,$3,$6,$9,"'$file6'" }' file

chr1    -   10625   0   0   formatedFile3
chr1    +   16616   0   0   formatedFile3
chr1    -   120482  0.50105411  1   formatedFile3
chr1    -   247355  0.50105411  1   formatedFile3
chr1    +   535689  0   0   formatedFile3

값은 4열부터 6열까지입니다. Round2 값은 7열부터 9열까지입니다. 파일이 너무 길어서 루프를 사용하고 싶습니다.

    file4=formatedFile1
    file5=formatedFile2
    file6=formatedFile3
    
    recurrenceCol=3
    for col in 4 5 6
    do
        col1=$col
        col2=$((col+recurrenceCol))

        echo $col1
        echo $col2
        id="file"$col
        out=out"$ID" 

awk 'BEGIN {OFS="\t"} { print $1,$2,$3,$'$col1', $'$col2', "'$ID'" }' file 
   


    done

스크립트는 열 6의 파일 이름을 인쇄하지 않기 때문에 원하는 출력을 제공하지 않습니다. 열 6 값 file4는 File1 형식이어야 합니다.

스크립트의 출력입니다.

chr1    -   10625   0   0   file4
chr1    +   16616   0.10217712  1   file4
chr1    -   120482  0   0   file4
chr1    -   247355  0   0   file4
chr1    +   535689  0.10217712  1   file4


chr1    -   10625   0   0   file5
chr1    +   16616   0   0   file5
chr1    -   120482  0   0   file5
chr1    -   247355  0   0   file5
chr1    +   535689  0   0   file5

등.

답변1

거의 다 왔습니다. 여러분이 놓친 것은 indirection operator ${!varname}varname에 있는 변수의 값을 인쇄하는 bash를 사용하는 것입니다.

또한 awk 코드에서 쉘 변수를 사용하는 정식|올바른 방법은 해당 -v awkvar=shell_data변수를 awk 문에 직접 삽입하는 것입니다.

    file4=formatedFile1
    file5=formatedFile2
    file6=formatedFile3
    
    recurrenceCol=3
    for col in 4 5 6
    do
        col1=$col
        col2=$((col+recurrenceCol))

        echo $col1
        echo $col2
        id="file"$col
        out=out"$ID"
        f=${!id}

   awk -v col1="$col1" \
       -v col2="$col2" \
       -v id="$f" '
BEGIN {OFS="\t"}
{
 print $1,$2,$3,$(col1),$(col2),id
}
    ' file
 # echo --- -- --- --- --- ---
    done

관련 정보