awk的最基本功能是在文件或者字符串抽取信息。通常awk是以文件的一行为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文本,几个常用的参数和命令。
// test.txt
aaa 10 20
bbb 20 30
aaa 30 10
ccc 40 5
ccc 20 10
ccc 40 6
第二列求和:
cat test.txt | awk '{sum += $2};END {print sum}'
第二列为值,第一列为 key,求每个 key 对应的所有值的和:
cat test.txt | awk '{sum[$1]+=$2} END {for(i in sum) print i,sum[i]}'
ccc 100
bbb 20
aaa 40
统计第一列的元素分别出现了几次:
cat test.txt |awk '{sum[$1]+=1}END{for(i in sum)print i,sum[i]}'
ccc 3
bbb 1
aaa 2
统计前两列元素出现的次数:
cat test.txt |awk '{sum[$1" "$2]++}END{for(i in sum)print i,sum[i]}'
bbb 20 1
aaa 10 1
ccc 20 1
aaa 30 1
ccc 40 2
打印文件名,每行的行号,每行的列数,对应的完整内容:
- -F指定分隔符
- FILENAME:文件名
- NR:每行的行号
- NF:每行的列数
- 1表示当前行的第一个域,$2表示当前行的第二个域,......以此类推。
awk -F ' ' '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' test.txt
filename:test.txt,linenumber:1,columns:3,linecontent:aaa 10 20
filename:test.txt,linenumber:2,columns:3,linecontent:bbb 20 30
filename:test.txt,linenumber:3,columns:3,linecontent:aaa 30 10
filename:test.txt,linenumber:4,columns:3,linecontent:ccc 40 5
filename:test.txt,linenumber:5,columns:3,linecontent:ccc 20 10
filename:test.txt,linenumber:6,columns:3,linecontent:ccc 40 6
打印第一列,最后一列,倒数第二列,第二行:
awk -F " " '{print $1}' test.txt
awk -F " " '{print $NF}' test.txt
awk -F " " '{print $NF-1}' test.txt
awk -F " " 'NR==2 {print "filename:" FILENAME " content:" $0}' test.txt
aaa
bbb
aaa
ccc
ccc
ccc
20
30
10
5
10
19
29
9
4
9
5
filename:test.txt content:bbb 20 30
网友评论