将变量与列号链接

时间:2014-11-26 12:21:48

标签: bash awk

我有一个以下格式的文件:

run-225-1 178.165 178.165 117.025
run-84-7 178.308 178.308 117.028
run-247-2 178.750 178.750 117.110
run-7-7 178.760 178.760 117.117
run-110-5 177.644 177.644 117.121
run-5-5 179.173 179.173 117.121
run-56-7 179.220 179.220 117.131
run-78-1 178.176 178.176 117.167

我用awk来计算每个数值列的平均值和标准差。

然后,我使用IF语句比较标准偏差,以确定哪个列包含最差数据:

if [[ $ASTD > $BSTD ]]; then
    top=$ASTD
else
    top=$BSTD
fi

if [[ $top > $CSTD ]]; then
    BAD=$top
else
    BAD=$CSTD
fi

echo $BAD

我现在要做的是从列中每个元素中减去具有最差标准差($ BAD)的平均值(使用awk),然后将减法结果作为新列附加。

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

这可能不是最好的方法,但我首先要弄清楚哪一列会返回最差的"最差的"标准差,

if [[ $ASTD > $BSTD ]]; then

top=$ASTD
col=1
else

top=$BSTD
col=2
fi

if [[ $top > $CSTD ]]; then

BAD=$top
else 
BAD=$CSTD
col=3

fi

然后将col参数传递给awk

awk -v col=$col bad=$BAD '{print $0, $(col) - bad}' <infile>

您可能需要使用$(col)

中的间接

答案 1 :(得分:0)

埃斯!

这是我所拥有的;

根据具有最高标准偏差的A B或C,根据均值对cell.txt进行排序

如果[[$ ASTD&gt; $ BSTD]];然后

top=$ASTD
col=2
mean=$AMEAN

否则
    顶部= $ BSTD     山口= 3     平均= $ BMEAN 网络

如果[[$ top&gt; $ CSTD]];然后

BAD=$top

否则     BAD = $ CSTD     山口= 4     平均= $ CMEAN 网络

回声最差维度是$ col echo mean是$ mean

awk -v column = $ {col} -v mean = $ {mean}&#39; {$ 5 = $(column) - mean;打印}&#39; cell.txt&gt;&gt; tmp.txt

sort -k5 -n tmp.txt&gt; sorted.txt

rm tmp.txt

如果有人有更优雅的解决方案,请告诉我们!