linux awk合并文件内容,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岁

0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值