Awk

使用循環從表中提取列

  • April 12, 2021

我有這個矩陣。

#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

該腳本沒有提供所需的輸出,因為它沒有在 column6 中列印文件名。column6 值 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

等等 。

你快到了,你錯過的是使用 bashindirection 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

引用自:https://unix.stackexchange.com/questions/644633