- 921. Minimum Add to Make Parentheses Valid 使括号有效的最少添加
- 915. Partition Array into Disjoint Intervals 分割数组
- 932. Beautiful Array 漂亮数组
- 940. Distinct Subsequences II 不同的子序列 II
到目前为止,我们的 AWK 程序都是把结果输出到 标准输出 上。
虽然AWK 程序没有打开文件/读写文件等相应的功能,但 AWK 程序同样支持 重定向 操作,也就是支持把数据输出到 文件 上。
AWK的重定向操作一般出现在 print 或 printf 语句后面。
AWK中的重定向与 shell 命令中的重定向类似,只是它们写在 AWK 程序中。
重定向操作符 >` 就是把 AWK 程序的输出结果重定向到某个文件。
不过要注意的是:重定向操作符 > 会先删除文件的原先内容然后再写入数据,也就是说原先的内容不存在了。
重定向操作符 > 操作符的语法格式如下
print DATA > output-file
重定向操作符 >` 会把 print 的输出结果写入到文件 output-file 中
如果output-file 不存在,重定向操作符 >` 会先创建文件。
重定向操作符 > 会首先删除文件中的内容然后再输出,但是,对于同一个 AWK 程序中的后续的 重定向操作符 > 则并不会再删除原先的内容,而是在末尾追加。
也就是说,重定向操作符 > 在打开文件的时候就会先删除内容。后面的 重定向操作符 > 因为文件已经打开了,就不会再执行打开操作,也就不会删除原先的内容
首先我们使用 重定向操作符 > 创建一个文件并写入数据
[www.ddkk.com]$ echo "旧数据:DDKK.COM 弟弟快看,程序员编程资料站欢迎您" > /tmp/message.txt
[www.ddkk.com]$ cat /tmp/message.txt
运行上面的 awk 命令,输出结果如下
旧数据:DDKK.COM 弟弟快看,程序员编程资料站欢迎您
接着,我们再使用 重定向操作符 > 往文件里写入一些数据,看看结果
[www.ddkk.com]$ awk 'BEGIN { print "新数据:DDKK.COM 弟弟快看,程序员编程资料站欢迎您" > "/tmp/message.txt" }'
[www.ddkk.com]$ cat /tmp/message.txt
运行上面的 awk 命令,输出结果如下
新数据:DDKK.COM 弟弟快看,程序员编程资料站欢迎您
数据追加操作就是把输出输出到文件的末尾,而不是覆盖原先的内容。
数据追加操作符 >>` 的语法格式如下
print DATA >> output-file
数据追加操作符 >>` 会把 print 的输出结果 追加 到 output-file 文件的末尾,原先的数据还在。
如果output-file 文件不存在,那么会先创建文件然后再输入数据。
我们首先使用 重定向操作符 > 创建一个文件并写入一些数据
[www.ddkk.com]$ echo "旧数据:DDKK.COM 弟弟快看,程序员编程资料站欢迎您" > /tmp/hello.txt
[www.ddkk.com]$ cat /tmp/hello.txt
运行上面的 awk 命令,输出结果如下
旧数据:DDKK.COM 弟弟快看,程序员编程资料站欢迎您
接下来我们使用 数据追加操作符 >>` 往刚刚的 hello.txt 文件中追加一些数据
[www.ddkk.com]$ awk 'BEGIN { print "新数据:DDKK.COM 弟弟快看,程序员编程资料站欢迎您" >> "/tmp/hello.txt" }'
[www.ddkk.com]$ cat /tmp/hello.txt
运行上面的 awk 命令,输出结果如下
旧数据:DDKK.COM 弟弟快看,程序员编程资料站欢迎您
新数据:DDKK.COM 弟弟快看,程序员编程资料站欢迎您
AWK还支持管道及管道操作符 |。
也就是说我们可以使用管道代替文件将输出发送到另一个程序。
管道操作符 | 会打开一个管道,AWK 通过此管道将输出的结果写入另一个进程以执行该命令。
管道重定向参数命令实际上是 AWK 表达式。
AWK中管道 | 的语法格式如下
print items | command
下面,我们使用管道 | 把输出重定向到外部的 tr 命令
[www.ddkk.com]$ awk 'BEGIN { print "hello, world !!!" | "tr [a-z] [A-Z]" }'
运行上面的 awk 命令,输出结果如下
HELLO, WORLD !!!
AWK可以使用 |& 与外部进程通信。
|& 会打开一个双向交流管道,AWK 程序可以往打开的管道进行读写,外部程序也可以往打开的管道进行读写。
AWK中|& 双向管道的语法格式如下
print items |& command
BEGIN {
cmd = "tr [a-z] [A-Z]"
print "hello, world !!!" |& cmd
close(cmd, "to")
cmd |& getline out
print out;
close(cmd);
}
运行上面的 awk 命令,输出结果如下
HELLO, WORLD !!!
上面这段程序看起来是不是很迷茫 ??
这估计是我们见过的最为复杂的程序了,下面我们就一步一步来拆解吧!!!
1、 第一行cmd="tr[a-z][A-Z]定义了一个系统命令,我们会使用这个命令开启一个双向通讯管道;
2、 第二行print"hello,world!!!"|&cmd;
我们先来看 |& cmd ,这句话的意思是使用 |& 输出重定向运算符打开一个 双向通讯管道 连接当前 AWK 程序和刚刚定义的命令。
然后 print "hello, world !!!" |& cmd 就是把 print 函数的输出结果重定向到刚刚定义的 双向通讯管道。
说的直白一点,就是 print 函数为 tr 命令提供了输入。 3、 第三行close(cmd,"to")用于关闭刚刚打开的双向通讯管道的输入进程;
4、 第四行cmd|&getlineout把tr命令的执行结果使用管道运算符&|重定向到getline函数getline函数会把结果储存到out变量中;
5、 最后一行close(cmd)用于关闭刚刚打开的双向通讯管道;
是否可以从 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
我是一名优秀的程序员,十分优秀!