awk笔记备忘

awk pattern { action } {filenames}

# $0变量是指整条记录,$1表示当前行的第一个域,$2表示当前行的第二个域,$n当前记录的第n个域,字段间由FS分隔, 每行按 FS 字段分隔符(默认是空格或tab)
# cat 1.txt
Beth    4.00    0
Dan     3.75    0
kathy   4.00    10
Mark    5.00    20
Mary    5.50    22
Susie   4.25    18

# 输出文本中的1、3列
 awk '{print $1,$3}’ 1.txt 

Beth 0
Dan 0
kathy 10
Mark 20
Mary 22
Susie 18

# $NF是number finally,表示最后一列的信息
awk '{print $NF}' 1.txt

0
0
10
20
22
18

# 筛选 第三列等于0的第一列的值
awk  '$3 == 0 {print $1}' 1.txt
Beth
Dan


# -F 指定输入文件折分隔符
cat 2.txt
# 2.txt
Beth:4.00:0

awk -F ':' '{print $2}' 2.txt
4.00

# 打印出每行的行号NR代表行号
awk  '{print "我是行号",NR,$0}' 1.txt

我是行号 1 Beth 4.00    0
我是行号 2 Dan  3.75    0
我是行号 3 kathy        4.00    10
我是行号 4 Mark 5.00    20
我是行号 5 Mary 5.50    22
我是行号 6 Susie        4.25    18

# BEGIN 和 END  
# BEGIN 用于匹配第一个输入文件的第一行之前的位置, END 则用于匹配处理过的最后一个文# 件的最后一行之后的位置
awk 'BEGIN { print "标题一标题二 标题三"; print "-------------------"} { print}' 1.txt

标题一标题二 标题三
-------------------
Beth    4.00    0
Dan     3.75    0
kathy   4.00    10
Mark    5.00    20
Mary    5.50    22
Susie   4.25    18

# 打印最后一行 等同于  tail -n 1 1.txt  等同于  sed -n '$p' 1.txt

awk 'END { print $0}' 1.txt

Susie   4.25    18

# 设置变量
awk '{tail=($1 "~~~~~")} {print tail}' 1.txt

Beth~~~~~
Dan~~~~~
kathy~~~~~
Mark~~~~~
Mary~~~~~
Susie~~~~~

# for循环 每行打印2遍
awk '{for(i=0; i < 2; i++) print $0}' 1.txt

Beth    4.00    0
Beth    4.00    0
Dan     3.75    0
Dan     3.75    0
kathy   4.00    10
kathy   4.00    10
Mark    5.00    20
Mark    5.00    20
Mary    5.50    22
Mary    5.50    22
Susie   4.25    18
Susie   4.25    18

# 逆序打印
awk '{arr[NR] = $0 }END{for(i = NR;i >0;i --) print arr[i]}' 1.txt

Susie   4.25    18
Mary    5.50    22
Mark    5.00    20
kathy   4.00    10
Dan     3.75    0
Beth    4.00    0

# 去重复行
awk '!($0 in x){x[$0];print $0 }' 1.txt

# 其他:
https://www.gnu.org/software/gawk/manual/gawk.html#Advanced-Features

  

原文地址:https://www.cnblogs.com/leyi/p/12621188.html