将awk脚本写在文件里:一种高效的awk循环循环方式(代码片段)

Philbert Philbert     2023-01-28     687

关键词:

在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 

sed与awk(代码片段)

...到文件里的内容并生成备份文件-e执行多条命令-f引用sed脚本|bash将输出的结果交给bash执行例:sed-n‘9s#.*#echohehe#‘ppasswd|bashhehe将passwd文件 查看详情

linux - 带有 awk 的 for 循环

...assword1ip2user2password2ip3user3password3所以我在下面写了同样的脚本#!/bin/bashforvalin`awk\'NR>1print\'servers.list`doec 查看详情

将外部参数传入awk命令的方法汇总(代码片段)

将shell脚本里的参数传递进入awk命令里的方法:从文件中读取,从管道传递,从shell变量中读取将外部参数传递进入awk命令将shell脚本里的参数传递进入awk命令里的方法:从文件中读取,从管道传递,从shell变量中读取等,每种方... 查看详情

在 awk 循环中访问 bash 数组

...sh数组myarray=(12345...n)另外我正在读取一个只有一行输入的文件,例如:12345...n我正在将它逐行读取到一个数组中并打印:awk\'BEGINFS=OFS="\\t"NR>=1for(i=1;i<=NF;i++)a[i]+=$ 查看详情

shell命令三剑客之awk命令详解,cut命令,linux里记录行踪(操作记录)(代码片段)

...行踪(操作记录)的地方1.初识awk命令AWK是一种处理文本文件的语言,是一个强大的文本分析工具。AWK名字的来源:取了三位创始人AlfredAho,PeterWeinberger,和BrianKernighan的FamilyName的首字符。shell命令三剑客的比较:grep更适合单纯的... 查看详情

shell脚本——awk详细介绍(包含应用案例)(代码片段)

...符串比较数值比较目的关系运算符算术运算多条件运算awk脚本编程变量条件判断循环数组awk编程案例awk概述awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入、一个或多个文件,或其他 查看详情

awk(代码片段)

1.awk介绍awk是一种报表生成器,就是对文件进行格式化处理的,这里的格式化不是文件系统的格式化,而是对文件内容进行各种“排版”,进而格式化显示。在linux之上我们使用的是GNUawk简称gawk,并且gawk其实就是awk的链接文件,... 查看详情

将输出重定向到for循环shell中特定目录中的多个文件

...ell【发布时间】:2022-01-1916:29:17【问题描述】:我有一个脚本,可以对目录中的每个文件使用awk命令执行一些操作。为此,我使用for循环,但我希望为文件运行的每个awk命令将我的输出重定向到文件。像1个源文件->1个目标文 查看详情

for循环内的awk问题

...1-1717:55:05【问题描述】:我有许多以txt结尾的不同名称的文件。rtfgtq56.txtfgutr567.txt..所以我正在运行这个命令foriin*txtdoawk-F"\\t"\'print$2\'$i|grep"K"|awk\'print\'ORS=\';\'|awk-F"\\t"\'OFS="\\t";pri 查看详情

awk语法

...令插入一个文件,并使awk程序可执行,然后用awk命令作为脚本的首行,以便通过键入脚本名称 查看详情

文本处理三剑客之gawk

...具;sed是文本行编辑器,而awk是一种报表生成器,就是对文件进行格式化处理的,但这里的格式化不是文件系统的格式化,而是对文件内容进行各种“排版” 查看详情

如果所有值都相同,则循环遍历 bash 测试中的列 - AWK

...AWK【发布时间】:2021-11-2422:27:58【问题描述】:我想遍历文件中的每一列并检查所有值是否匹配。如果他们这样做,请转到下一列。一旦检测到不匹配,循环将停止并仅打印到前一列。我认为我需要在AWK中使用数组,但不知道如... 查看详情

为啥我的 for 循环在 AWK 中运行和重置?

...理。我有这个代码awk\'for(i=0;i<NR;i++)printi\'我正在阅读的文件有四行五列。最终打印出来01230123012301230123为什 查看详情

shell脚本--压缩一个文件里里面的所有log文件

...'print($9)'--不知道这个如何循环了。我每次执行这个脚本的时候只压缩最早的一个文件夹里面的所有内容如果执行gizp*失败或者这个文件夹已经压缩循环执行下一个,直到gzip*执行成功后退出。麻烦大神帮忙补充完或者有更好... 查看详情

shell脚本保姆级教程(代码片段)

...test测试操作2.整数值比较3.文件状态测试4.组合命令5.监控脚本基础知识六.if语句1.单分支if语句2.双分支if语句七.for循环99乘法表八.while循环猜数字游戏九.case语句石头剪刀布游戏数组十.shell函数十一.中断和退出十二.字符串的处理... 查看详情

shell中awk问题:我想循环输出一个txt文件中第10列到第25列的内容

我想循环输出一个txt文件中第10列到第25列的内容,awk怎么写?我这样写的:k=10while[$k-le25]docattxt.txt|awk'print$k'>sample.txt......somethingelsedone测试发现程序中awk没有执行,如果想输出第十列那么就是awk‘print$10’可是现在列是... 查看详情

while循环(代码片段)

...[email protected]"主题""内容"#之前配置zabbix的发送邮件的脚本top|mail-s"loadishigh:$load"[email protected]fisleep30#休眠30s,30s之后循环执行。done#固定格式w|head-1|awk-F‘loadaverage:‘‘print$2‘|cut-d.-f1#查询系统负载。w,表示查看负载head-1... 查看详情

听说awk语言也可以编写脚本

 导读从awk系列开始,我们都是在命令行或者脚本文件里写一些简短的awk命令和程序。然而awk和shell一样也是一个解释型语言。通过从开始到现在的一系列的学习,你现在能写可以执行的awk脚本了。概述和写shell脚本差不多,aw... 查看详情