沙漏不倒翁 - 小屋

awk

基本语法

BEGIN {}
pattern1 {}
pattern2 {}
END {} 

pattern 的选择,正则表达式

实用变量

可以在BEING或者-v后面修改这些值
NF 本行字段数目
OFS 输出分隔符
FS 输入分隔符,可用 -F: 指定为冒号
FILENAME 当前输入文件的名称
NR 记录数(行数)
ORS 输出记录的分隔符(默认换行)
RS 输入记录的分隔符(默认换行)
FNR 当前记录序号

可以用正则表达式赋值,如 RS=:+ 表示行分隔符是1个或多个:

选项

-F -F: 指定分隔符为冒号
-v -v FS=":"

命令行参数

存在ARGV 数组中, 键值是数字

环境变量

存在ENVIRON数组中,键值是变量名字符串,如 ENVIRON["HOME"]

分支

if (?)
  ?
else if (?)
  ?
else
  ?

循环

while ()
  ?
  
for (;;)
  ?
  
array["map"] = 2
array[1] = 3
for (a in array)
  print a, array[a]
# map 2
# 1 3
 
if("map" in array)
    print "map is in array"
    

流程控制

break  
continue  
next 下一条记录
nextfile  
exit exitcode  

输入

getline 从当前输入文件中读取下一条记录存入$0并更新NF, NR, FNR  
getline var 存入var并更新 NR, FNR  
getline < file 重定向  
`cmd getline` 管道

管道例子: "ls" | getline ; print $0

重定向

awk '{print $0 > "1.txt" }' b.cpp

执行外部程序

管道和输出重定向可以实现,也可以用system

system("ls")

函数

function f(a, b)
{
return a+b
    
}
f(1, 2)


主题来自 Ruchee