ループを使用してテーブルから列を抽出する

ループを使用してテーブルから列を抽出する

私はこの行列を持っています。

#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

おすすめ記事