awk 功能比sed更加强大,但表达式会相对复杂一些
输入文本 test.txt:
ID type old new
A01_1 1_34189552 0|0 0|0
A01_2 1_65117762 1|0 1|0
A01_3 1_70543349 0|0 0|0
首先说明几个比较重要的内置参数
NF #列数
awk '{print $0, NF}' test.txt #每一行都是4列
ID type old new 4
A01_1 1_34189552 0|0 0|0 4
A01_2 1_65117762 1|0 1|0 4
A01_3 1_70543349 0|0 0|0 4
$NF #尾列
awk '{print $NF}' test.txt
new
0|0
1|0
0|0
NR #行号
awk '{print "行号:"NR, $0}' test.txt
行号:1 ID type old new
行号:2 A01_1 1_34189552 0|0 0|0
行号:3 A01_2 1_65117762 1|0 1|0
行号:4 A01_3 1_70543349 0|0 0|0
FNR # 若有两个文件,NR会递增,FNR在新文件下会从1开始
FS #输入分隔符
OFS #输出分隔符
awk 'BEGIN{FS="_";OFS="---"}{print $1,$2}' test.txt
ID type old new---
A01---1 1
A01---2 1
A01---3 1
RS #输入行分隔符
ORS #输出行分隔符
- 1.输出特定行
awk '{print $1,$3}' test.txt 以\t为输出分隔符输出第一列和第三列
ID old
A01_1 0|0
A01_2 1|0
A01_3 0|0
指定分隔符 -F
awk -F_ '{print $1}' test.txt # 以_作为输入数据分割
ID type old new
A01
A01
A01
awk -F'[_\|]' '{print $1,$2,$3,$4}' test.txt #多个分隔符以'[分隔符1分隔符2]'
ID type old new
A01 1 1 34189552 0 0 0
A01 2 1 65117762 1 0 1
A01 3 1 70543349 0 0 0
设置变量 -v
awk -F_ -va=2 '{print $1,$2+a}' test.txt # 数字相加
ID type old new 2
A01 3
A01 4
A01 5
awk -F_ -va=2 '{print $1,a$2}' test.txt # 字符拼接
ID type old new 2
A01 21 1
A01 22 1
A01 23 1
外部文件 -f
script.awk
{print $1}
{print $2}
awk -f script.awk test.txt
ID
type
A01_1
1_34189552
A01_2
1_65117762
A01_3
1_70543349
A01_4
1_77765794
A01_5
1_109674087
A01_6
1_194530914
A01_7
1_224812701
A01_8
2_3645429
A01_9
2_21527764
A01_10
2_28792335
A01_11
2_142074734
判断语句 if ||为或 &&为与
awk '{if($1=="ID"||$2=="1_65117762")print $1,$2}' test.txt #多个条件使用||
ID type
A01_2 1_65117762
格式化输出printf
awk '{printf("%-8s %-12s %-4s\n", $1,$2,$3)}' test.txt
# %-8s 8个字符宽度的字段中左对齐输出
#若要输出浮点数%6.2f 以6个字符长度小数点长度2
ID type old
A01_1 1_34189552 0|0
A01_2 1_65117762 1|0
A01_3 1_70543349 0|0
过滤某行
awk '{$1=""; $2="";print $0}' test.txt # 不输出$1,$2
old new
0|0 0|0
1|0 1|0
0|0 0|0