将awk脚本写在文件里:一种高效的awk循环循环方式
Posted Philbert
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将awk脚本写在文件里:一种高效的awk循环循环方式相关的知识,希望对你有一定的参考价值。
在shell循环中常常会内置固定的awk命令,如果每次循环中awk内部的命令的不一样怎么办呢?可以将awk内部的命令提前写入文件中。这样可以方便后续修改。
将awk脚本写在文件里:一种高效的awk循环循环方式
在shell循环中常常会内置固定的awk命令,如何让awk内部的命令的设定随着循环次数而变化呢?可以借助数组或文件来解决。
需求描述
一个化学成分的csv文件,包含1000个样品里Mg,Fe,Ca三种元素的含量。
需要生成三个散点图数据文件,分别用来投Fe-Mg散点图;Mg/(Mg+Fe)-Fe; Mg/Fe-Ca/Fe。
数据没有清洗,因此不仅需要剔除NaN值和空格,还需要将脚本设置的易于修改,以便后续分析时能够初步筛选数据。
输入数据input.csv如下
#sampleNO, Mg, Fe, Ca
1, 34, 56, 4
2, 45, , 1
3, NaN, NaN,3
...
1000, 29, 50, 9
常规用法
常规方法是写三个awk命令,分别输出三个文件。
对于需求1:Fe-Mg散点图的数据文件:
cat inpu.csv | awk -F\',\' \'if ($1>0 && $2>0) print $2,$1\' > out1.txt
对于需求2:Mg/(Mg+Fe)-Fe散点图的数据文件:
cat inpu.csv | awk -F\',\' \'if ($1>0 && $2>0) print $1/($1+$2),$2\' > out2.txt
对于需求3:Mg/Fe-Ca/Fe散点图的数据文件:
cat inpu.csv | awk -F\',\' \'if ($1>0 && $2>0 && $3>0) print $1/$2,$3/$2\' > out3.txt
高级用法:加循环
这次的需求少,只输出三个文件还好,如果需求增加到三百个文件就会很费力。
我们将需求写入一个文件bash.tmp中,这样以来在后续增加需求的时候,只需要修改bash.tmp文件就可以了。
bash.tmp的四列分别代表:需求编号,数据筛选条件,散点图X坐标,散点图Y坐标。
#!/bin/bash
# 把awk命令写在文件里,由于不能写`$`符号,所以先用`#`符号代替。
cat > bash.tmp << EOF
1, #1>0 && #2>0, #2, #1
2, #1>0 && #2>0, #1/(#1+#2), #2
3, #1>0 && #2>0 && #3>0, #1/#2, #3/#2
EOF
# 将`#`符号替换为`$`符号
sed -i \'s/#/$/g\' bash.tmp
# 用循环生成文件
for ((i=1; i<=3; i++)); do
c=$(awk -F\',\' \'if ($1==\'"$i"\') print $2\' bash.tmp)
x=$(awk -F\',\' \'if ($1==\'"$i"\') print $3\' bash.tmp)
y=$(awk -F\',\' \'if ($1==\'"$i"\') print $4\' bash.tmp)
awk -F\',\' \'if (\'"$c"\') print \'"$x"\',\'"$y"\'\' input.csv > out$i.txt
done
作者:Xuran,中科院在读博士,博客网址https://www.cnblogs.com/liangxuran/转载请标明出处。
以上是关于将awk脚本写在文件里:一种高效的awk循环循环方式的主要内容,如果未能解决你的问题,请参考以下文章