专栏首页蓝天用awk数组处理两个文件的例子

用awk数组处理两个文件的例子

收了本论坛的三个例子

QUOTE:

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" "; 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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 玩转「Wi-Fi」系列之应用程序(五)

    Linux 下的常用网络应用程序有很多, 核心基本都是wpa_supplicant的封装。这里主要分类介绍:

    程序手艺人
  • [Linux]Linux下安装和配置solr/tomcat/IK分词器 详细实例二.

    为了更好的排版, 所以将IK分词器的安装重启了一篇博文,  大家可以接上solr的安装一同查看. [Linux]Linux下安装和配置solr/tomcat/I...

    一枝花算不算浪漫
  • [Linux驱动炼成记] 05-存储eMMC配置

    eMMC (Embedded Multi Media Card) 为MMC协会所订立的,eMMC 相当于 NandFlash+主控IC ,对外的接口协议与SD、...

    程序手艺人
  • [ 利器篇 ] - LInux 下百度网盘客户端 BaiduPCS

    如果平时电脑的操作系统为Linux,那如何下载百度网盘中文件呢 ? 百度网盘网页版默认下载有大小限制,如果超过之后会默认打开本地安装百度网盘(Linux 根本没...

    程序手艺人
  • [ 利器篇 ] - 升级Ubuntu 18.04系统工具集合

    工作中大部分的开发环境一般都是 Ubuntu 16.04,而我也不例外,最近几天花部分时间作一下系统的备份和升级, 顺便体验下Ubuntu 18.04 新系统,...

    程序手艺人
  • Ubuntu格式化分区/挂载

    电脑一般会装两块硬盘,一块SSD,一块机械硬盘,安装Ubuntu系统之后就涉及了分区的操作,这里做一些简单记录

    程序手艺人
  • [ Docker篇 ] - 拓冰之旅

    工作过程中经常会搭建各种设备的编译环境,电脑出现问题,安装系统之后还需要重新搭建,然而现在Docker 帮你解决环境配置难的问题,Docker 类似与虚拟机,但...

    程序手艺人
  • Linux上传文件和下载文件命令行方式

    输入rz命令后,会弹出对话框,选择你要上传的文件,选择打开就上传到Linux主机。上传的文件在当前命令行的目录下

    秋白
  • 实现Ubuntu网络快速连接

    工作之后一直以Ubuntu系统为主力开发环境,系统自带的网络管理network和第三方开源网络wicd使用效果一般,连接,切换网络的速度比较慢,由此这里卸载系统...

    程序手艺人
  • [ Andriod篇 ] - Android 5.0.2 源码编译

    Android 源码版本比较多, 这里选择的是 韦东山第四期 Andriod 教程中的 Android-5.0.2, 直接从百问网公开的百度网盘链接下载。由于源...

    程序手艺人

扫码关注云+社区

领取腾讯云代金券