`
lykm02
  • 浏览: 50970 次
  • 性别: Icon_minigender_2
  • 来自: 上海
社区版块
存档分类
最新评论

awk NR==FNR

阅读更多
转载
NR is the number of the file, if there are two file as parameters, there will be just line count.
FNR just is the number of the file.

1、用某一文件的一个域替换另一个文件中的的特定域?
http://bbs.chinaunix.net/forum/viewtopic.php?t=500015
文件passwd:
s2002408030068:x:527:527::/home/dz02/s2002408030068:/bin/pw
s2002408032819:x:528:528::/home/dz02/s2002408032819:/bin/pw
s2002408032823:x:529:529::/home/dz02/s2002408032823:/bin/pw

文件shadow:
s2002408030068:$1$d8NwFclG$v4ZTacfR2nsbC8BnVd3dn1:12676:0:99999:7:::
s2002408032819:$1$UAvNbHza$481Arvk1FmixCP6ZBDWHh0:12676:0:99999:7:::
s2002408032823:$1$U2eJ3oO1$bG.eKO8Zupe0TnyFhWX9Y.:12676:0:99999:7:::

用shadow文件中的密文部分替换passwd中的"x",生一个新passwd文件,如下所示
s2002408030068:$1$d8NwFclG$v4ZTacfR2nsbC8BnVd3dn1:527:527::/home/dz02/s2002408030068:/bin/pw
s2002408032819:$1$UAvNbHza$481Arvk1FmixCP6ZBDWHh0:528:528::/home/dz02/s2002408032819:/bin/pw
s2002408032823:$1$U2eJ3oO1$bG.eKO8Zupe0TnyFhWX9Y.:529:529::/home/dz02/s2002408032823:/bin/pw

[Copy to clipboard] [ - ]
CODE:
awk 'BEGIN{OFS=FS=":"} NR==FNR{a[$1]=$2}NR>FNR{$2=a[$1];print}' shadow passwd

NR==FNR,第一个文件shadow,以$1为下标,将$2的值赋给数组a
NR>FNR,第二个文件passwd,将文件shadow$2的值赋值给文件passwd


QUOTE:
2、
cat file1:
0011AAA 200.00 20050321
0012BBB 300.00 20050621
0013DDD 400.00 20050622
0014FFF 500.00 20050401

cat file2:
I0011  11111
I0012  22222
I0014  55555
I0013  66666

规则:比较 file1的1-4字符 和 file2的2-5 字符,如果相同,将file2 的第二列 与 file1 合并 file3

0011AAA 200.00 20050321 11111
0012BBB 300.00 20050621 22222
0013DDD 400.00 20050622 66666
0014FFF 500.00 20050401 55555

[Copy to clipboard] [ - ]
CODE:
awk  'NR==FNR{a[substr($1,2,5)]=$2}NR>FNR&&a[b=substr($1,1,4)]{print $0, a[b]}' file2 file1 >file3



QUOTE:
3、如果文件a中包含文件b,则将文件b的记录打印出来
http://bbs.chinaunix.net/forum/viewtopic.php?t=520411

文件a:
10/05766798607,11/20050325191329,29/0.1,14/05766798607
10/05767158557,11/20050325191329,29/0.08,14/05767158557

文件b:
05766798607
05766798608
05766798609
通过文件a和文件b对比,导出这样的文件出来.
10/05766798607,11/20050325191329,29/0.1,14/05766798607

a

[Copy to clipboard] [ - ]
CODE:
wk -F'[/,]' 'ARGIND==1{a[$0]}ARGIND>1{($2 in a);print $0}' b a
awk -F'[/,]' 'NR==FNR{a[$0]}NR>FNR{($2 in a);print $0}' b a



QUOTE:
4、
file1文件内容
   1     0.5  100
                                 10  15    36.5
file2文件
        50   10    9
                                 3.2   1     5
将两个文件合成一个文件如:
   51     10.5    109
                                                              13.2   16      41.5
就是对应的字段进行相加以后的数字。
awk '{for (i=1;i<=NF;i++) a=$i
getline <"file2"
for (i=1;i<NF;i++) printf $i+a" ";
printf $NF+a[NF] "\n"}' file1

[Copy to clipboard] [ - ]
CODE:
awk '{for (i=1;i<=NF;i++) a[i]=$i;getline <"file2";for (i=1;i<NF;i++) printf $i+a[i]" ";printf $NF+a[NF] "\n"}' file1



QUOTE:
5、
文件a
1000 北京市 地级 北京市 北京市
1100 天津市 地级 天津市 天津市
1210 石家庄市 地级 石家庄市 河北省
1210 晋州市 县级 石家庄市 河北省
1243 滦县 县级 唐山市 河北省
1244 滦南县 县级 唐山市 河北省

b文件:
110000,北京市
120000,天津市
130000,河北省
130131,平山县
130132,元氏县
这样的字段
a中第二列在b中可能有可能没有,需要把有的匹配起来生成新的一列:要包含a和b的第一列。没有匹配的按照b原来的格式进行输出。

[Copy to clipboard] [ - ]
CODE:
awk 'BEGIN{FS="[ |,]";OFS=","}NR<=FNR{a[$2]=$1}NR>FNR{print $1,$2,a[$2]}' a b



QUOTE:
6、
file1的第一列与file2的第3列相同,
file1的第二列与file2的第4列的3-5位相同,
file1的第三列与file2的最后一列相同,
# cat file1
AAA  001  1000.00
BBB  001  2000.00
DDD  002  4000.00
EEE  002  5000.00
FFF  003  6000.00
# cat file2
01 1111  AAA  WW001  $$$$  1000.00
02 2222  BBB  GG001  %%%%  2000.00
03 3333  CCC  JJ001  ****  3000.00
04 4444  DDD  FF002  &&&&  4000.00
05 5555  EEE  RR002  @@@@  5000.00
06 666   FFF  UU003  JJJJ  6000.00
07 777   III  II005  PPPP  7000.00
08 8888  TTT  TT008  TTTT  8000.00

[Copy to clipboard] [ - ]
CODE:
# awk 'NR<=FNR{a[$1]=$1"x"$2"x"$3}
> NR>FNR{b=substr($4,3);c=$3"x"b"x"$6;if(c==a[$3]) print}' file1 file2
01 1111  AAA  WW001  $$$$  1000.00
02 2222  BBB  GG001  %%%%  2000.00
04 4444  DDD  FF002  &&&&  4000.00
05 5555  EEE  RR002  @@@@  5000.00
06 666   FFF  UU003  JJJJ  6000.00
分享到:
评论

相关推荐

    yinyuemi--awk初学之常见问题1

    执行`awk '{print "NR = " NR " FNR = " FNR $0}' file1 file2`会得到: ``` NR = 1 FNR = 1 a NR = 2 FNR = 2 b NR = 3 FNR = 3 c NR = 4 FNR = 1 d NR = 5 FNR = 2 e NR = 6 FNR = 3 f ``` 3. Awk如何引入外部...

    AWK中FNR和NR,OFS和FS,RS和ORS.txt

    在深入探讨AWK中FNR和NR,OFS和FS,RS和ORS这些核心概念之前,我们先简要回顾一下AWK的基本功能。AWK是一种强大的文本处理工具,主要用于模式扫描与处理语言,广泛应用于数据处理、报告生成、格式转换等场景。其核心...

    awk中NR和FNR的区别小结和实例演示

    ### awk中NR和FNR的区别详解与实例演示 在学习awk这一强大的文本处理工具时,了解NR和FNR这两个变量的用法对于高效地进行数据处理尤为重要。本文将详细介绍NR和FNR的区别,并通过实际例子来帮助理解它们各自的功能...

    如何查看 Linux 下内存占用率、 CPU 的占用率.docx

    这里 `NR==2` 和 `FNR==2` 都表示选取第二行,其中 `$3/$2*100` 表示将第三列(已用内存)除以第二列(总内存)然后乘以100得到内存使用率。 - **计算包含百分比符号及保留两位小数的内存占用率**: ```bash $ ...

    用awk数组处理两个文件

    awk -F'[/,]' 'NR==FNR{a[$0]}NR&gt;FNR{if ($2 in a) print $0}' b a &gt;c ``` 这种方法的逻辑与方法一类似,但使用`NR`(总行数)和`FNR`(当前文件的行数)来区分处理不同的文件。当`NR==FNR`时,将`b`文件的内容...

    LINUX中详解AWK内建变量FS,NF,NR,RT,RS,ORS,OFS

    ### Linux中AWK内建变量FS、NF、NR、RT、RS、ORS、OFS详解 #### 一、概述 AWK是一种强大的文本处理工具,主要用于格式化文本数据,广泛应用于Linux/Unix环境中。它拥有丰富的内置变量和函数,使得用户能够方便地...

    awk实例详解——Unix下awk的使用

    `awk`提供了许多内置变量,如`NF`表示当前行的字段数,`NR`表示已读取的记录数(行数),`FNR`则是在当前文件中的记录数。 **4. 模式匹配** `awk`的模式可以是正则表达式,例如`/pattern/`,也可以是逻辑表达式,如...

    awk命令详解 快速进阶 简洁入门

    awk -F '%' 'NR==7,NR==15 {printf "%s%s%s\n", $1, $3, $7}' inputfile ``` 在这个例子中,我们首先通过 `-F '%'` 设置字段分隔符为 `%`;然后,通过 `NR==7,NR==15` 指定只处理第七行到第十五行之间的内容;最后...

    awk详细用法小结awk awk

    - `FNR`:当前文件中的行号,独立于总行号NR。 - `FS`:字段分隔符,默认为空白字符。 - `IGNORECASE`:忽略大小写差异,用于模式匹配。 - `NF`:当前行中的字段数量。 - `NR`:总行号,从第一行开始计数。 - `OFMT`...

    awk实用手册

    awk提供许多内置变量,如`NR`记录已处理的行数,`NF`表示当前行的字段数,`FNR`仅在当前文件中的行数。这些变量可以方便地在处理过程中进行条件判断。 6. **条件语句与循环** awk支持条件语句`if...else`和循环`...

    Linux/Unix AWK详细用法中文图解

    2. 行号:`NR`变量表示已读取的行数,可以用来匹配特定行,如`NR==5`匹配第五行。 3. 文件名:`FNR`变量是相对于当前文件的行数,用于多文件处理。 三、内置变量与字段分隔 1. 默认情况下,AWK将空格或制表符视为...

    awk实现Left、join查询、去除重复值以及局部变量讲解例子

    awk 'NR==FNR{a[$1]=$2;}NR!=FNR && a[$1]{print $1","a[$1]","$2","$3}' a.txt b.txt ``` 这里,`NR` 表示当前处理的总行数,`FNR` 表示当前文件的行数。当 `NR==FNR` 时,我们处理第一个文件 `a.txt`,并将第一列...

    awk用法__都是例子

    awk '{print NR,NF,$1,$NF}' file 显示文件 file 的当前记录号、域数和每一行的第一个和最后一个域。 示例 3:通过管道符获得输入 df | awk '$4&gt;1000000' 通过管道符获得输入,显示第 4 个域满足条件的行。 示例 ...

    linu awk命令详解_linuawk命令详解_

    - `FNR`记录当前文件已处理的行数,多文件处理时与NR不同。 - `ORS`和`OFS`分别设置输出记录和输出字段的分隔符。 5. **动作和控制结构** - 动作可以包括变量赋值、条件语句(if...else)、循环(for, while)等...

    AWK应用和讲解步骤

    awk '{ if ($1 == "root") { print $1 } else if ($1 == "seker") { print $6 } else if ($1 == "zorro") { print $7 } else { print NR } }' /etc/passwd ``` #### 示例5:使用表达式 ```bash awk '{ print($3 &gt; ...

    awk 工具用法说明

    - `awk '{print NR, NF, $1, $NF}' file`: 显示文件`file`的每行的行号、字段数量及第一和最后一个字段。 4. **使用管道进行处理** - `df | awk '$4&gt;1000000'`: 通过管道将`df`命令的输出传递给`awk`,显示第四列...

    Awk入门教程 《Awk A Tutorial and Introduction - by Bruce Barnett》

    NR - The Number of Records Variable RS - The Record Separator Variable ORS - The Output Record Separator Variable FILENAME - The Current Filename Variable Associative Arrays Multi-dimensional ...

    unix之AWK使用小解

    - `awk '{print NR, NF, $1, $NF}' file`:打印每行的行号、字段数、第一列以及最后一列的值。 - `awk '/101/{print $1, $2+10}' file`:如果一行包含“101”,则打印该行的第一列和第二列加10的结果。 - `awk '/101...

Global site tag (gtag.js) - Google Analytics