- 921. Minimum Add to Make Parentheses Valid 使括号有效的最少添加
- 915. Partition Array into Disjoint Intervals 分割数组
- 932. Beautiful Array 漂亮数组
- 940. Distinct Subsequences II 不同的子序列 II
循环 用于以重复方式执行一组动作。只要循环条件为真,循环执行就会继续。
AWK语言中也存在循环。
对标C 语言, AWK 中也有三大循环、三大循环流程改变语句。
三大循环分别是:
1、 for循环;
2、 while循环;
3、 dowhile循环;
三大循环状态变更语句分别是:
1、 break语句退出循环;
2、 continue终止当前迭代的执行,开始下一个迭代;
3、 exit()退出当前程序;
下面,我们就一步一个脚印,慢慢的来了解下这六大语句。
for 循环还是那个 for 循环,简直一点变化都没有。
AWK中的 for 循环语法格式如下
for (initialization; condition; increment/decrement)
action
不得不吐槽,还是有变化的,就是,少了 大括号 {}
我们来看看这个标准的 for 循环。
1、 for循环的小括号内总共包含三大块语句,和两个必选的分号;,三个语句都是可以省略的;
2、 第一个语句称之为:初始化语句只要执行一些初始化操作,比如初始化循环变量;
3、 第二个语句称之为:循环判断语句也就是检查条件,确定是否有必要进行下一次循环;
4、 第三个语句称之为:循环变量递增语句一般情况下用于递增循环变量;
5、 当循环判断语句返回true,也就是当前循环允许被执行,那么就会执行后面的action语句块;
整个for 循环,只要 循环判断语句 一直返回 true,那么它就一直循环下去,永不退出。
第二个,我们要讲诉的是小括号内三大语句的执行时机。
1、 初始化语句在整个循环开始前执行,而且只会执行一次;
2、 循环判断语句会在每次循环前执行,如果不满足条件则退出整个循环,如果满足条件则执行action;
3、 循环变量递增语句会在每次循环结束后执行,用于递增循环变量;
好了,for 循环语句差不多就这些知识了,下面我们使用一个范例来演示一下
下面的范例使用 for 循环语句输出 1 2 3 4 5 5个数字
[www.ddkk.com]$ awk 'BEGIN { for (i = 1; i <= 5; ++i) print i }'
运行以上 awk 命令,输出结果如下
1
2
3
4
5
很多时候,我都在想,这些破编程语言到底要做啥啊。已经有一个 for 循环,为啥还要其它的循环语句做啥啊。
while 循环就是我所说的那个不知道为啥还存在的循环。
我们先不说 while 循环。我们先来看看刚刚那个 for 循环。大家会不会觉得这个 for 循环有点复杂啊。
三大语句:初始化语句、循环判断语句、循环变量递增语句 中只有第二个语句看起来才是每次循环必须的。
1、 初始化语句既然是在整个循环开始前执行,那么我们直接放在循环开始前就好了;
2、 循环变量递增语句既然是在每次循环结束后执行,那直接放在action语句中就好了,反正结果都一样;
这样想想,其实也就 循环判断语句 判断语句有点用。既然这样,我们就重新造一个关键字 while 来实现刚刚我们说的。
也即是说,while 循环语句会一直执行,直到 循环判断语句 返回 false。
AWK中的 while 循环语法格式如下
while (condition)
action
while 循环会在每次执行前检查循环条件 condition 的值是否为 true。只要为 true,就会执行 action ,那么循环就会一直下去
既然学会了 while 循环,那么我们就用 while 循环改写上面的 for 语句吧。
[www.ddkk.com]$ awk 'BEGIN {i = 1; while (i < 6) { print i; ++i } }'
运行以上 awk 命令,输出结果如下
1
2
3
4
5
到目前为止,我们已经学了两个循环了: for 循环和 while 循环。
不知道大家有没有发现,这两个循环都有有一个缺点,当然了,也是它们的有点:先判断执行。
也即是每次,包括第一次都是先判断条件,然后为 true 才执行。
但往往,有时候,我们可能需要先执行一次,然后再判断条件是否允许下一个循环。这种情况往往发正在 循环判断 条件第一次还没准备好,需要先执行一次才会准备好的情况。
针对这种情况,do-while 循环出现了。do-while 循环会先执行一次循环代码,然后在判断条件是否允许下一次执行。
do-while 循环的语法格式如下
do
action
while (condition)
也即是说 do-while 循环至少会执行一次 action。
既然学会了 do-while 循环,那么我们就用 do-while 循环改写上面的 for 语句吧。
[www.ddkk.com]$ awk 'BEGIN {i = 1; do { print i; ++i } while (i < 6) }'
运行以上 awk 命令,输出结果如下
1
2
3
4
5
好啦好啦,我们已经学会了三大循环语句了,大家用起来感觉如何???
在日常的编程中,不知道大家有没有这样的请求,如果 action 语句块中也能退出循环就好了。
哈哈,为了响应这个请求,语言的开发者们早点就想到了这一块了,于是有了 break 语句。
也就是说 break 语句的出现,就是为了在 action 语句块中可以退出循环语句。
break 语句的语法格式如下
break;
很简洁,不拖泥带水的。
小试牛刀一下,我们使用 break 语句在 sum 大于 50 就退出循环。
[www.ddkk.com]$ awk 'BEGIN {
sum = 0; for (i = 0; i < 20; ++i) {
sum += i; if (sum > 50) break; else print "Sum =", sum
}
}'
运行以上 awk 命令,输出结果如下
Sum = 0
Sum = 1
Sum = 3
Sum = 6
Sum = 10
Sum = 15
Sum = 21
Sum = 28
Sum = 36
Sum = 45
break 语句让我们尝到了甜头,有时候我们就会突发奇想,有没有另一个关键字,不像 break 语句那样直接退出整个循环,而仅仅是退出当前循环。也就是剩下的语句不执行了,开始下一个迭代。
创造了那些语言的前辈们,自然也会有这个想法,于是造出了 continue 语句。
continue 语句,简单的说,就是停止执行剩下的语句,直接进入下一个循环。
continue 语句的语法格式如下
continue;
[www.ddkk.com]$ awk 'BEGIN {
for (i = 1; i <= 20; ++i) {
if (i % 2 == 0) print i ; else continue
}
}'
运行以上 awk 命令,输出结果如下
2
4
6
8
10
12
14
16
18
20
exit 语句是用来退出整个程序的。
既然能够退出整个程序,那自然也能退出循环。你说是不?
exit 语句用于停止脚本的执行。它接受一个整数作为参数,它是 AWK 进程的退出状态代码。
如果未提供参数,则退出返回状态 0。
exit 语句的语法格式如下
exit [status_code]
[www.ddkk.com]$ awk 'BEGIN {
sum = 0; for (i = 0; i < 20; ++i) {
sum += i; if (sum > 50) exit(10); else print "Sum =", sum
}
}'
运行以上 awk 命令,输出结果如下
Sum = 0
Sum = 1
Sum = 3
Sum = 6
Sum = 10
Sum = 15
Sum = 21
Sum = 28
Sum = 36
Sum = 45
在命令行/终端模式下,我们要如何检查程序的退出状态码呢?
哈哈,别急,可以使用 $
?
Shell 终端要检测上一个脚本的退出状态吗,可以直接使用 echo $
? 命令
[www.ddkk.com]$ echo $?
运行以上 awk 命令,输出结果如下
10
是否可以从 awk 文件执行另一个 awk 文件?使用 awk 文件我需要执行当前文件夹中的所有 awk 文件。是否可以在 awk 中进行此类操作? 最佳答案 是的你可以。您需要使用 system()
这是一个 awk 脚本,它尝试根据第一列设置两个文件的差异: BEGIN{ OFS=FS="\t" file = ARGV[1] while (getline < file)
awk 逐行处理文件。假设每一行操作不依赖于其他行,有没有办法让 awk 一次并行处理多行? 是否有任何其他文本处理工具可以自动利用并行性并更快地处理数据? 最佳答案 唯一试图提供 awk 并行实现的
我有文件: 结果.txt Apple fruits 10 20 30 Car vehicle 40 50 60 Book study 70 80 90 假设这里第 2 列是特征,第 3 列是最小值
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我对 awk 的行为感到惊讶表演时浮点数 计算。它导致我对表格数据进行错误计算。 $ awk 'BEGIN {print 2.3/0.1}' 23 0.1}' )。 那么我应该如何执行大于 (
为什么我在下面的例子中得到分隔符前后的空格? awk -F'^' '{print $1,":",$2}' SERVER_2012-02-29-12-15-00 3969 : 1272 3969 :
我有一个文件,其中每四行是这样的: HISEQ15:454:D27KKACXX:6:2316:16241:100283 1:N:0:GTTTCG (对于那些感兴趣的人,此文件包含DNA序列) 我需
你能帮我按 $2 列中的坐标合并行吗?有一系列坐标以一个为单位增长。我想输出 f.e. :第 1 行合并到第 4 行 9079811-9079814,之后没有系列,因此将其合并到另一行等。对于输入中的
大家好,我是 awk 的新手,我可以问一下我有这样的输入文件吗: # ABC DEFG value1 GH value2 GH value3 GH # BCF SQW value4 GH value5
大家好,我想问一下,我对awk中的括号{}感到非常困惑,就像我写了一段代码 { FNR == 3 { print $1 " age is " $2 } } 但它在外括号上给了我错误但没有在打印语
我想知道如何在 awk 中使用多行注释。到目前为止,我一直在使用 # 来评论一行。有人可以就此指导我。谢谢你。 最佳答案 AWK 中没有多行注释,但如果需要,您可以伪造它。这是一种至少适用于 GNU
关于AND逻辑运算符的一个基本问题。我试图根据第1列和第2列的值提取数据文件niveles.csv中的某些字段。我想写一个awk语句,说“当field1 = date和field2 = area然后打
以下命令按预期工作。 # some command | awk '/(\|\|\)/,/;/' create table todel1 (id int) max_rows=2 /*!*/; alter
我有一个日志文件,需要在服务器上“重播”。 它包含这样的条目: Request: query: EXEC prc_insert_customer @param0: 11
如何从制表符分隔的字符串中选择第一列? # echo "LOAD_SETTLED LOAD_INIT 2011-01-13 03:50:01" | awk -F'\t' '{prin
我正在尝试在目录中的多个文件的内容中执行一些 grep 并将我的 grep 匹配附加到单个文件中,在我的输出中我还想要一个包含文件名的列,以了解哪些文件条目已被拾取。我试图使用 awk 来实现相同的目
我想选择文件中第9列的绝对值小于500的行。列有时为正,有时为负。 awk -F'\t' '{ if ($9 output.bam 到目前为止这不起作用..互联网上的一轮告诉我,要使用绝对值,我们应
例如,假设我运行以下命令: gawk -f AppendMapping.awk Reference.tsv TrueInput.tsv 假设文件名会改变。在遍历第一个文件时,我想创建一个映射。 map
我正在使用这个命令; awk -v regex1='new[[:blank:]]+File\(' 'BEGIN{print "Regex1 =", regex1}' 这警告我; awk: warnin
我是一名优秀的程序员,十分优秀!