使用循环从表中提取列

使用循环从表中提取列

我有这个矩阵。

#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

你就快到了,你错过的是 bash 的使用,indirection operator ${!varname}它会输出 varname 中保存的变量的值。

另外,规范的 |正确的方法是,在 awk 代码中使用 shell 变量是通过-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

相关内容