感谢支持
我们一直在努力

awk实际应用:文本合并

请使用awk命令将如下两份文件中名字相同的两行合并起来
[root@localhost ~]# cat 1.txt
韩海林 21岁
海林韩 23岁
韩林海 22岁
林海韩 24岁
[root@localhost ~]# cat 2.txt
韩林海 男
海林韩 男
韩海林 男
林海韩 男

输出效果:
    韩海林 21岁 男 
[root@localhost ~]# awk ‘NR==FNR{a[$1]=$2}NR>FNR{print $0,a[$1]}’ 2.txt  1.txt
韩海林 21岁 男
海林韩 23岁 男
韩林海 22岁 男
林海韩 24岁 男

[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]数组内容;
[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岁 男

文件顺序不同,结果也不同;
[root@localhost ~]# awk ‘NR==FNR{a[$1]=$2}NR>FNR{print $0,a[$1]}’ 1.txt 2.txt 
韩林海 男 22岁
海林韩 男 23岁
韩海林 男 21岁
林海韩 男 24岁

awk赋值操作符  http://www.linuxidc.com/Linux/2015-06/118887.htm

awk转义序列与算术操作符  http://www.linuxidc.com/Linux/2015-06/118886.htm

AWK简介及使用实例 http://www.linuxidc.com/Linux/2013-12/93519.htm

AWK 简介和例子 http://www.linuxidc.com/Linux/2012-12/75441.htm

Shell脚本之AWK文本编辑器语法 http://www.linuxidc.com/Linux/2013-11/92787.htm

正则表达式中AWK的学习和使用 http://www.linuxidc.com/Linux/2013-10/91892.htm

文本数据处理之AWK 图解 http://www.linuxidc.com/Linux/2013-09/89589.htm

如何在Linux中使用awk命令 http://www.linuxidc.com/Linux/2014-10/107542.htm

文本分析工具-awk  http://www.linuxidc.com/Linux/2014-12/110939.htm

本文永久更新链接地址:http://www.linuxidc.com/Linux/2015-07/120402.htm

赞(0) 打赏
转载请注明出处:服务器评测 » awk实际应用:文本合并
分享到: 更多 (0)

听说打赏我的人,都进福布斯排行榜啦!

支付宝扫一扫打赏

微信扫一扫打赏