博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
awk实际应用:文本合并
阅读量:6451 次
发布时间:2019-06-23

本文共 1346 字,大约阅读时间需要 4 分钟。

请使用awk命令将如下两份文件中名字相同的两行合并起来

1
2
3
4
5
6
7
8
9
10
[root@localhost ~]
# cat 1.txt
韩海林 21岁
海林韩 23岁
韩林海 22岁
林海韩 24岁
[root@localhost ~]
# cat 2.txt
韩林海 男
海林韩 男
韩海林 男
林海韩 男

输出效果:

    韩海林 21岁 男 

1
2
3
4
5
[root@localhost ~]
# awk 'NR==FNR{a[$1]=$2}NR>FNR{print $0,a[$1]}' 2.txt  1.txt
韩海林 21岁 男
海林韩 23岁 男
韩林海 22岁 男
林海韩 24岁 男
1
2
3
4
5
6
[root@localhost~]
# awk 'NR==FNR{a[$1]=$2}NR>FNR{print $0,a[$1]}' 2.txt  1.txt > 3.txt
[root@localhost ~]
# cat 3.txt 
韩海林 21岁 男
海林韩 23岁 男
韩林海 22岁 男
林海韩 24岁 男

解释:

在awk里,NR和FNR的含义相近,唯一的区别就是作用范围,NR是所有读取的行信息计数,而FNR是正在读取文件的行信息计数,FNR在文件切换时会从0重新开始计数,所以上述语句的意思是:

NR==FNR   NR最大值为4,FNR值为1-4,以2.txt的第一个数据项为key,$2即第2列为数据组成数组; 

NR>FNR   此时NR=(2.txt的总行数+FNR),NR最大值为8,FNR则重新从1-4计数,判断第一个数据项在不在2.txt数据组成的数组里,如果在,则打印本行加数组项。

NR是英文number of record的简写,就是awk每从文件或输入流中读入一行数据,就把这个变量加一。这个是awk自带的变量。

其他的解释:

NR==FNR{a[$1]=$2}

打开第一个文件2.txt,把文件里面的$2列的内容存入到a[$1]这个数组。

NR>FNR{print $0,a[$1]}

然后打开第二个文件,打印1.txt一行内容,然后打印第一个文件a[$1]数组的内容。

加入if判断,更容易理解,上面的命令省略了;判断1.txt的第一列内容在a数组里面,打印整行内容和a[$1]数组内容;

1
2
3
4
5
[root@localhost ~]
# awk 'NR==FNR{a[$1]=$2;next}NR>FNR{if($1 in a)print $0,a[$1]}' 2.txt 1.txt 
韩海林 21岁 男
海林韩 23岁 男
韩林海 22岁 男
林海韩 24岁 男

文件顺序不同,结果也不同;

1
2
3
4
5
[root@localhost ~]
# awk 'NR==FNR{a[$1]=$2}NR>FNR{print $0,a[$1]}' 1.txt 2.txt 
韩林海 男 22岁
海林韩 男 23岁
韩海林 男 21岁
林海韩 男 24岁
本文转自 模范生 51CTO博客,原文链接:http://blog.51cto.com/mofansheng/1671764,如需转载请自行联系原作者
你可能感兴趣的文章
linux 上面配置apache2的虚拟目录
查看>>
Linux学习总结 (未完待续...)
查看>>
NoSQL数据库探讨 - 为什么要用非关系数据库?
查看>>
String字符串的截取
查看>>
switch函数——Gevent源码分析
查看>>
Spring MVC简单原理
查看>>
DynamoDB Local for Desktop Development
查看>>
ANDROID的SENSOR相关信息
查看>>
laravel 使用QQ邮箱发送邮件
查看>>
用javascript验证哥德巴赫猜想
查看>>
Shell编程-环境变量配置文件
查看>>
thymeleaf 中文乱码问题
查看>>
(转)CSS浮动(float,clear)通俗讲解
查看>>
os.walk函数
查看>>
[Unity3d]DrawCall优化手记
查看>>
细数.NET 中那些ORM框架 —— 谈谈这些天的收获之一
查看>>
SQL Serever学习7——数据表2
查看>>
洛谷——P2404 自然数的拆分问题
查看>>
(转)Mac 下设置android NDK的环境
查看>>
[struts]s:action 的使用方法
查看>>