Linux中NR的含义,awk之NR==FNR,如何理解呢-程序员宅基地

技术标签: Linux中NR的含义  

转载:https://www.cnblogs.com/irockcode/p/7044722.html

nr,表示awk开始执行程序后所读取的数据行数.

fnr,与nr功用类似,不同的是awk每打开一个新文件,fnr便从0重新累计.

下面看两个例子:

1,对于单个文件nr 和fnr 的 输出结果一样的 :

2,但是对于多个文件 :

在看一个例子关于nr和fnr的典型应用:

现在有两个文件格式如下:

想要得到的结果是将用户名,帐号和金额在同一行打印出来,如下:

张三|000001|10

张三|000001|20

李四|000002|30

李四|000002|15

执行如下代码

注释:

由nr=fnr为真时,判断当前读入的是第一个文件a,然后使用{a[$2]=$0;next}

循环将a文件的每行记录都存入数组a,并使用$2第2个字段作为下标引用.

由nr=fnr为假时,判断当前读入了第二个文件b,然后跳过{a[$2]=$0;next},

对第二个文件cdr的每一行都无条件执行{print a[$1]"|"$2},

此时变量$1为第二个文件的第一个字段,与读入第一个文件时,采用第一个文件第二个字段$2为数组下标相同.

因此可以在此使用a[$1]引用数组。

=========================================================================

下面是cu大神jason680的详细过程分析

awk -f'|' 'nr==fnr{a[$2]=$0;next}{print a[$1] fs $2}' a b

there is no begin block, and fs="|" by -f'|' argument

没有开始模块,直接识别-f选项,加参数

start to first file 'a'

从a文件的第一行开始

1. read file a line 1 and get data 张三|000001

读取文件a的第一行,得到数据

a: $0=张三|000001

b: $1=张三

c: $2=000001

nr and fnr are the same equal to 1, and run nr=fnr block

此时,nr与fnr的值相等都为1,执行nr=fnr模块

nr==fnr{a[$2]=$0;next}

a: a[$2]=$0

a[000001]=张三|000001

b: next

next cycle and get next line data

2. read file a line 2 and get data 李四|000002

读取文件a的第二行,得到数据

a: $0=李四|000002

b: $1=李四

c: $2=000002

nr and fnr are the same equal to 2, and run nr=fnr block

此时,nr与fnr的值相等都为2,执行nr=fnr模块

nr==fnr{a[$2]=$0;next}

a: a[$2]=$0

a[000002]=李四|000002

b: next

next cycle and get next line data

end of the file a, and get next file b data

读完文件a,然后读取下一个文件b的数据

3. read file b line 1, and get data 000001|10

读取文件b的第一行,然后得到数据

a: $0=000001|10

b: $1=000001

c: $2=10

now, nr is 3 and fnr is 1, they are not eqaul

此时,nr与fnr的值不同,不执行nf=fnr模块,执行下一个模块{print a[$1] fs $2}

and didn't run nr=fnr block,

and run next block {print a[$1] fs $2}

a[$1] => a[000001] => 张三|000001

fs => |

$2 => 10

you will see the output

张三|000001|10

4. read file b line 2, and get data 000001|20

a: $0=000001|20

b: $1=000001

c: $2=20

nr is 4 and fnr is 2, they are not eqaul

and didn't run nr=fnr block,

and run next block {print a[$1] fs $2}

a[$1] => a[000001] => 张三|000001

fs => |

$2 => 20

you will see the output

张三|000001|20

cycle to read the file b

5. read file b line 3, and get data 000002|30

...

output==> 李四|000002|30

6. read file b line 4, and get data 000002|15

...

output==> 李四|000002|15

补充:

找出两个文件之间的不同部分

awk 'nr==fnr{a[$0]++} nr>fnr&&!a[$0]' 1.txt 2.txt

awk 'nr==fnr{a[$0]}nr>fnr{ if(!($1 in a)) print $0}' 1.txt 2.txt

找出两个文件之间的相同部分

awk 'nr==fnr{a[$0]++} nr>fnr&&a[$0]' 1.txt 2.txt

awk 'nr==fnr{a[$0]}nr>fnr{ if($1 in a) print $0}' 1.txt 2.txt

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_31319319/article/details/116981846

智能推荐

pheatmap:绘制聚类热图的函数_pheatmap基于kmeans绘制热图-程序员宅基地

文章浏览阅读342次,点赞4次,收藏6次。该函数还允许使用 kmeans 聚类聚合行。如果行数太大,以至于 R 无法再处理其分层聚类,大约超过 1000 行,则建议这样做。与其单独显示所有行,不如提前对行进行聚类,并仅显示聚类中心。可以通过参数kmeans_k调整集群的数量。来源:https://www.rdocumentation.org/packages/pheatmap/versions/1.0.12/topics/pheatmap。一个绘制聚类热图的函数,可以更好地控制一些图形参数,如单元大小等。Examples 例子。_pheatmap基于kmeans绘制热图

html div四边阴影效果-程序员宅基地

文章浏览阅读369次。<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml..._div四周阴影效果

Java 通过反射获取实体类对应的注释_java获取实体类属性注解-程序员宅基地

文章浏览阅读1.7k次。Java 通过反射获取实体类对应的注释 _java获取实体类属性注解

在使用Mybatis的association属性,两张表中存在相同字段名,联表查询时的冲突解决办法_mybatis association绑定相同对象-程序员宅基地

文章浏览阅读2.3k次,点赞5次,收藏10次。在使用MyBatis进行多表联查时,想要获取关联外键的表的数据信息,使用association进行联查,但当外键表的字段名和主表相同时,外键表的数据就会被覆盖。_mybatis association绑定相同对象

湘潭大学2018年上学期程序设计实践模拟考试3 参考题解_在湘大xx奶茶店夏天推出了新的饮料价格为5元。 很多学生都要买饮料,每个学生-程序员宅基地

文章浏览阅读2.7k次。体验1: 军神太强啦,1小时屯6题,瞬间AK,接下来的90分钟一直在跟榜体验2: A题原题,循环写得好就不麻烦,不然要写很多行,情况要想全并不难。 B题原题,有了上一场的提示之后,这题就不难了。 C题很简单(小声)。 D题卡掉了O(T*N*K*log(N))的方法,卡掉我5发logN ,不过还是可做。 E题水dp(组合数学)。 F题原题,记忆化搜索。体验3: 被DC两题卡到..._在湘大xx奶茶店夏天推出了新的饮料价格为5元。 很多学生都要买饮料,每个学生

微信小程序预览pdf,页面缓存下载过的pdf_微信浏览器请求pdf文件会缓存吗-程序员宅基地

文章浏览阅读2.8k次。需求:  点击预览图标查看该pdf报告问题:  1、最早是直接将请求倒的url放入到<web-view src="{{realUrl}}"></web-view>中展示,ios可以,安卓显示无法查看。  2、通过微信自身的API实现:wx.downloadFile({})、wx.saveFile({})、wx.openDocument({})  3、对于文件较大的,下载较慢,需要点击过的进行缓存,再次点击无需下载,直接打开。  将点击过的下载的url添加给list的tem_微信浏览器请求pdf文件会缓存吗

随便推点

服务部署之配置网络策略服务(NPS)(基于Windows Server 2022)_windows server 部署网络策略服务-程序员宅基地

文章浏览阅读680次。服务部署之配置网络策略服务(NPS)(基于Windows Server 2022)_windows server 部署网络策略服务

视频异常检测 综述(二)_视频异常检测综述-程序员宅基地

文章浏览阅读4.8k次,点赞6次,收藏29次。基于距离、概率、重构的视频异常检测概述_视频异常检测综述

trajan割点模板-程序员宅基地

文章浏览阅读107次。洛谷P3388#include<bits/stdc++.h>using namespace std;typedef long long ll;typedef unsigned long long ull;const int N=2e4+5;const int mod=1e9+7;vector<int> g[N];set<int> v;int dfn[N],low[N],fa[N];int n,m,tot;void tarjan(int x){

linux如何关闭硬件加速,启用硬件加速是什么意思?如何关闭【详解】-程序员宅基地

文章浏览阅读1k次。导语:小编相信,经常会使用到电脑的朋友们,对于启用硬件加速这个词一定都是不陌生的吧!可是呢,对于一些电脑小白们来说,往往会搞不清楚,这个启用硬件加速到底是个什么意思呢?启用之后,我们的电脑又会发生什么变化呢?也有一些人,在启用之后,却不知道应该如何关闭这个硬件加速,接下来,小编就来为大家介绍一下启用硬件加速是什么意思,以及它应该如何关闭。启用硬件加速是什么意思?简而言之,硬件加速就是利用硬件模块来..._linux 禁用硬件加速合成、图层和素材面板

SHAP: 在我眼里,没有黑箱_python对shap的计算只能针对大数值吗-程序员宅基地

文章浏览阅读8.1k次,点赞13次,收藏191次。1. 写在前面很多高级的机器学习模型(xgboost, lgb, cat)和神经网络模型, 它们相对于普通线性模型在进行预测时往往有更好的精度,但是同时也失去了线性模型的可解释性, 所以这些模型也往往看作是黑箱模型, 在2017年,Lundberg和Lee的论文提出了SHAP值这一广泛适用的方法用来解释各种模型(分类以及回归), 使得前面的黑箱模型变得可解释了,这篇文章主要整理一下SHAP的使用, 这个在特征选择的时候特别好用。这次整理, 主要是在xgboost和lgb等树模型上的使用方式, 并且用一个_python对shap的计算只能针对大数值吗

【操作系统】考研真题攻克与重点知识点剖析 - 第 1 篇:操作系统概述_2021-程序员宅基地

文章浏览阅读625次。这篇文章深入探讨了操作系统的各个方面,以及相关的计算机科学概念。文章的结构包括对操作系统的定义和功能的讨论,涵盖了硬件管理、操作系统特征、启动过程、运行环境等多个方面。作者使用思维导图和具体版本(如哈工大版本、王道版本)作为辅助,系统性地介绍了操作系统的运行机制,包括中断与异常、系统调用等内容。文章还回顾了操作系统的历史发展,按照不同线索(如哈工大版本)进行叙述,涵盖了操作系统的发展与分类、体系结构等方面。最后,文章提到了一些考研真题,强调了对计算机科学相关概念的深入理解。_2021

推荐文章

热门文章

相关标签