文本处理神器AWK语言初步

文章目录

    • 初步认识
    • 命令执行
    • 脚本文件
    • 输入输出
    • 管道

初步认识

AWK主要用于文本数据处理,由Afred, Weinberger和Kernighan设计,故名AWK。

AWK的初始版本由AT&T实验室开发,此外,NAWK是AWK的改进版本,而应用最广泛的当属GAWK,即GNU AWK,为Linux内置的默认版本,对AWK和NAWK可以完全兼容。

Awk的程序结构包括三个区块:

  • 开始块BEGIN {awk-commands}
  • 主体块/pattern/ {awk-commands}
  • 结束块END {awk-commands}

其中awk-commands表示awk指令;/pattern/表示指定的处理模式。

以文本文件test.txt为例,下面为其内容

1)    Amit     Physics    80
2)    Rahul    Maths      90
3)    Shyam    Biology    87

命令执行

通过awk可以逐行打印出这个文本文件,并可以添加表头,方法如下

$ awk 'BEGIN{printf "No\tName\tSub\tMarks\n"}{print}' test.txt
No      Name    Sub     Marks
1)    Amit     Physics    80
2)    Rahul    Maths      90
3)    Shyam    Biology    87

其基本方法为,可用awk直接调用后面的字符串中所写的脚本命令。其中BEGIN标识的大括号为开始块,用于打印表头;后面的{print}为主体块,表示按行打印test.txt中的内容。

通过$选列,可实现单行输出,例如只想输出人名,则

awk 'BEGIN{printf "Name\n"}{print $2}' test.txt
Name
Amit
Rahul
Shyam

其中$2表示第二列。

脚本文件

通过awk -f命令,可以执行脚本,例如可将同样的功能封装入脚本test.awk中,

# test.awk文件
BEGIN{
    printf "Name\n"
}
{
    print $2
}

然后在命令行中调用,其效果与刚刚相同

$ awk -f test.awk  test.txt
Name
Amit
Rahul
Shyam

输入输出

除了可以将处理结果打印在命令行中,awk也可以将其输出到文本文件,其方法为

print DATA > oFile
print DATA >> oFile

可将DATA输出到oFile中,如果oFile不存在,则先创建该文件。>为写入模式,若oFile存在,数据输出前会将oFile中原有的数据删除;>>为追加模式,数据将在oFile结尾写入。

下例将test.txt打开,并重新存储到new.txt

awk '{ print $0 > "./new.txt" }' test.txt

当然也可以交换两列的位置

$ awk '{print $4,$3,$2,$1 > "./new.txt"}' test.txt
$ cat new.txt
80 Physics Amit 1)
90 Maths Rahul 2)
87 Biology Shyam 3)

管道

AWK可通过管道将一个程序的输出传递给另一个程序,其使用方法为

print items | command

例如下例将hello, world"传递给tr

$ awk 'BEGIN { print "hello, world" | "tr [a-z] [A-Z]" }'
HELLO, WORLD !!!

通过|&可使用双工管道,进行双向通信

# 文件pipe.awk
BEGIN {
    cmd = "tr [a-z] [A-Z]"  # 建立双向通信惯导
    print "hello, world !!!" |& cmd # 为tr提供输入
    close(cmd, "to")        # 执行后关闭to进程
    cmd |& getline out      # 将输出存储到out中
    print out;              # 打印out
    close(cmd);             # 关闭cmd
}

执行脚本后可得到

HELLO, WORLD !!!

文本处理神器AWK语言初步_第1张图片

你可能感兴趣的:(软件入门,awk,文本处理,管道,脚本,linux)