首页 > 其他分享 >将awk脚本写在文件里:一种高效的awk循环循环方式

将awk脚本写在文件里:一种高效的awk循环循环方式

时间:2023-01-27 16:00:57浏览次数:39  
标签:文件 Mg 高效 散点图 循环 awk Fe &&

将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 

标签:文件,Mg,高效,散点图,循环,awk,Fe,&&
From: https://www.cnblogs.com/liangxuran/p/17068920.html

相关文章

  • 【Java】用增强for循环遍历元素提示并发修改异常
    做二叉树遍历时使用了增强for循环,但是出现异常:Exceptioninthread"main"java.util.ConcurrentModificationException原因是:迭代器遍历元素的时候,通过集合是不能修改元素......
  • Python入门之for循环练习
    """for:适合执行预定次数。while:适合根据条件循环执行。"""#for变量in可迭代对象#循环体str01="我叫黎二狗!"#item存储的是字符串中每个字符串......
  • IntelliJ中高效重构的 10 个快捷方式
    前言在日常的开发工作中,我们经常需要重构,重构可以让我们写出的代码更上一层楼。所以,我会借助IntelliJ提供的一些功能,帮助我高效进行重构。这里是我推荐10个快捷方式,也是我......
  • 循环
    循环c++如何实现格式化输出#include<iostream>#include<iomanip>usingnamespacestd;intmain(){intno=0,yes=0,yes_count=0;intn,k;cin>>n>>k......
  • Python入门之选择语句&循环语句练习
    """选择语句ifbool类型的条件:pass满足条件执行的语句else:不满足条件执行的语句----------------------------......
  • Python入门之初识while循环
    """循环语句while条件:循环体"""#死循环:循环条件永远是满足的。whileTrue:usd=int(input("请输入美元:"))print(usd*6.9)i......
  • 浙大“python->机器语言“的学习二(循环计算)
    辗转相除Euclid设a,b为两个自然数,欲求a,b的最大公约数若a%b为0,则b就是a,b的最大公约数,计算结束否则令a为b,而b为原来的a%b,重复步骤2a,b=map(int,input().spli......
  • 循环的魅力之冰冻QQ电脑管家6.9...
    效果截图如下,程序运行后,管家已经动弹不了了...主要代码如下: for(unsignedintnHand=10000;nHand<99999999;nHand++){//获取窗口标题......
  • 如何高效高性能的选择使用 MySQL 索引?
    想要实现高性能的查询,正确的使用索引是基础。本小节通过多个实际应用场景,帮助大家理解如何高效地选择和使用索引。1.独立的列独立的列,是指索引列不能是表达式的一部分,也不......
  • 事件循环Event loop,宏任务与微任务
    任务挂起、同步任务执行结束执行队列中的异步任务、执行script标签内部代码、setTimeout/setInterval、ajax请、postMessageMessageChannel、setImmediate、I/O(Node.js)Prom......