最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

环球观热点:将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, Ca1,    34, 56, 42,    45, , 13,   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 << EOF1, #1>0 && #2>0,         #2,         #12, #1>0 && #2>0,         #1/(#1+#2), #23, #1>0 && #2>0 && #3>0, #1/#2,      #3/#2EOF# 将`#`符号替换为`$`符号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}.txtdone 

关键词: 数据文件 化学成分 循环次数