awk中一个关于NR和FNR的应用

本文介绍了一个使用awk命令实现的文件匹配脚本,该脚本能够遍历两个目录中的文件,并依据特定字段进行匹配,最终将匹配成功的文件名输出到同一文件中。此方法适用于批量处理大量文件的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2011-11-13 wcdj

问题:
有两个目录,里面有很多的文件,目录a里的文件名都是20111111XXXXXX-00000000-XXXXXXX- XXXXXX.dat.Tdat,目录b里的文件名都是20111111XXXXXX-XXXXXXXX-XXXXXXX-00000000.Tdat,即目录a中文件的第二个字段和目录b中文件的第四个字段对应,如果两个字段相同,就把这两个文件名输出到同一个文件里,a,b目录中都有很多文件。

链接:
http://topic.youkuaiyun.com/u/20111111/16/b09ec762-86f0-4cc3-835e-2c4403bc839b.html

#!/bin/sh

ls a > a.file
ls b > b.file
awk -F'[-.]' 'NR==FNR {arr[$2]=$0;next}{if(arr[$4]) print arr[$4]"\n"$0}' a.file b.file > output.file




解释:
首先遍历目录a中的文件,将目录a中的所有文件以第二个字段为索引存储在一个数组中,然后再遍历目录b中的所有文件,以第四个字段为索引判断是否为空,若非空,即代表和目录a中的文件对应,然后分别打印出两个目录下的文件。
PS: NR表示当前记录数。FNR同NR,但相对于当前文件。

另外可参考:
http://blog.youkuaiyun.com/junmail/article/details/5793220


再附一个例子:


现有如下文件
2011-08-31|xxx|23|TGF|1.0
2011-08-31|xxx|23|TGF|1.0
2011-09-31|xxx|23|TGF|1.0
2011-09-31|xxx|23|TGF|1.0
2011-09-31|xxx|23|TGF|1.0
2011-08-31|xxx|23|TGF|1.0

变为:(以“|”为分割, 如果第一列,第二列,第四列相同,则在第四列之后加上_1,_2,_3之类的)


方法:

awk 'BEGIN{FS="|"; OFS="|"}{n=++a[$1$2$4]; if(n>1) $4=$4"_"n; print}' input_file





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值