Awk
使用循環從表中提取列
我有這個矩陣。
#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
等等 。
你快到了,你錯過的是使用 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