关闭

日常积累------awk脚本

239人阅读 评论(0) 收藏 举报
分类:

有必要将最近的一些技术整理整理,今天的主要整理目标:awk脚本

awk 命令的名称来源于三位作者的首字母,awk命令主要用逐行扫描处理文本文件,并且能够一次读取多个文件。

1.举一个简单的例子:

awk -F '\t' '{print $1,$2,$NF}' a.txt

awk 脚本每次读取a.txt文件中的一行,每一行按照回车符'\t'分割,$1对应分割后字符串数组的第一个字段,$2对应第二个,$NF对应当前行的最后一个字段。

print 表示将这三个字段打印出来(默认间隔为空格,可以设置)。

2.设置输出字段间隔符号:

awk -F '\t' 'BEGIN{OFS="\t"}{print $1,$2}' a.txt
awk 脚本内部有一些常用变量,OFS变量存储输出字段的间隔符号,$0表示当前整行。

3.两个文件取交集

awk -F '\t' 'NR==FNR{a[$1]=$0}NR>FNR{if($1 in a){print}}' a.txt b.txt > c.txt

上面的命令实现了两个文件按照第一列取交集,NR变量存储截止到目前awk脚本读取的行数,FNR对应当前文件的行数,第一个判断式处理第一个文件,并且以第一个文件的首列作为键存储进入数组a,第二个表达式处理第二个文件,大括号里面判断第二个文件的第一列字段是否在数组a当中,如果在则输出。

文件a.txt,b.txt取差集(b-a)

awk -F '\t' 'NR==FNR{a[$1]=$0}NR>FNR{if(!($1 in a)){print}}' a.txt b.txt > c.txt
文件a.txt,b.txt取并集

awk -F '\t' 'NR==FNR{a[$1]=$0;print}NR>FNR{if(!($1 in a)){print }}' a.txt b.txt > c.txt

4.使用shell变量

awk -F '\t' 'print "'$x'"' a.txt
采用双引号套单引号+$符号

5.调用系统命令

awk -F '\t' '{cmd = "./a.exe" $2}; cmd | getline x;print x} a.txt
a.exe是一个工具需要传递参数,awk脚本中将第二个字段的变量传给a, cmd保存命令字符串。cmd | getline x 运行命令并将结果保存在x当中。

6.正则表达式使用内部变量

awk -F '\t' 'NR==FNR{a[$1] = $0} NR>FNR{flag = 1; for(x in a){if($1 ~ x){flag = 0; break}}if(flag == 1){print }}' dict.txt a.txt > c.txt

x 为内部变量如果使用其作为正则匹配项,直接调用即可。该命令实现了在a.txt中的第一列字段中过滤字典中的关键字。

7.内部命令

awk -F '\t' '{lens = split($1,a,"\\$")}{for (i in a){print i}}' a.txt

将每一行的第一个字段再按照$符号切分,并且打印所有符号。








0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:12410次
    • 积分:333
    • 等级:
    • 排名:千里之外
    • 原创:21篇
    • 转载:2篇
    • 译文:0篇
    • 评论:0条