如何修改Awk命令筛选new.list中大于old.list末行$1的唯一行
筛选new.list中特定行的Awk命令
现有情况
当前使用以下命令对比两个已按数值排序的文件,输出new.list中第一列($1)在old.list里不存在的行:
awk -F, 'NR==FNR {exclude[$1];next} !($1 in exclude)' old.list new.list > changes.list
文件内容
- old.list:
30606,10,57561 30607,100,26540 30611,300,35,5.068 30612,100,211,0.035 30613,200,5479,0.005 30616,100,2,15.118 30618,0,1257,0.009 30620,14,8729,0.021
- new.list:
30606,10,57561 30607,100,26540 30611,300,35,5.068 30612,100,211,0.035 30613,200,5479,0.005 30615,50,874,00.2 30616,100,2,15.118 30618,0,1257,0.009 30620,14,8729,0.021 30690,10,87,0.021 30800,20,97,1.021
当前执行结果
30615,50,874,00.2 30690,10,87,0.021 30800,20,97,1.021
需求
需要修改命令,仅输出new.list中满足两个条件的行:
- $1在old.list中不存在(即new.list独有)
- $1的数值大于old.list最后一行的$1(即30620)
期望结果:
30690,10,87,0.021 30800,20,97,1.021
解决方案
可以使用以下Awk命令实现:
awk -F, 'NR==FNR {exclude[$1]; last=$1; next} !($1 in exclude) && ($1 > last)' old.list new.list > changes.list
命令逻辑解释
NR==FNR {exclude[$1]; last=$1; next}:处理第一个文件(old.list)时,将所有$1存入exclude数组,同时记录最后一行的$1到变量last,随后跳过后续逻辑。!($1 in exclude) && ($1 > last):处理第二个文件(new.list)时,仅输出满足两个条件的行:$1不在exclude数组内(即new.list独有),且$1的数值大于last(old.list最后一行的$1)。
内容的提问来源于stack exchange,提问作者bobylapointe
相关产品推荐
相关产品推荐

