首页 > 解决方案 > awk 中的 BEGIN 和 END 块

问题描述

我在 Mac 上的终端中使用 awk 命令。我想打印一个已经存在的文件的内容,并为每一列指定一个标题,我将使用选项卡将其分开,然后我想将输出发送到另一个文件。我将使用哪一行代码为列赋予标题?我希望使用简单的 awk 命令,如果我能以尽可能少的行完成任务,最好。

到目前为止,我已经尝试使用 BEGIN 命令。(我想给出的标题是名字,名字和分数)

BEGIN { print "First Name\tSecond Name\tScore}**

然后我想打印文件的全部内容。

{print} filename.txt

最后我想将输出保存到另一个文件

End{print} filename.txt > output.txt

一起做这一切

awk 'BEGIN {print "First Name\tSecond Name\tScore";}
{print} 
End{print}' filename.txt > output.txt

但是,这仅将标题保存到输出文件,而不是列下原始文件的内容。

标签: awk

解决方案


awk逐行处理文件。在它开始处理文件之前,你可以让它做一些事情。我们使用BEGIN关键字来说明下面的代码块是在处理之前执行的。与END文件每一行处理完成后运行相同。

虽然您的代码中有一些多余的位,例如不必要的END块,但假设您的filename.txt.

更简洁的awk代码是:

awk 'BEGIN {print "First Name\tSecond Name\tScore";}1' filename.txt > output.txt

在行动中(使用逗号而不是制表符,因为它更容易而且我很懒):

$ echo "1,2,3" > filename.txt
$ awk 'BEGIN {print "c1,c2,c3"}1' filename.txt > output.txt
$ cat output.txt
c1,c2,c3
1,2,3

推荐阅读