我有这个矩阵。
#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