正则复习2

简介:

扩展
awk 中使用外部shell变量http://ask.apelearn.com/question/199
命令示例:A=44echo "ABCD" | awk -v GET_A=$A '{print GET_A}'

  说明:-v选项用于定义参数,这里表示将变量A的值赋予GET_A。有多少个变量需要赋值,就需要多少个-v选项。与之等价的:应用于脚本中:

wKioL1nkJ8_hyJ9_AAIri81crtc365.png


文件内容:
cat filename
1111111:13443253456
2222222:13211222122
1111111:13643543544
3333333:12341243123
2222222:12123123123


运行脚本后结果为:
[1111111]
13443253456
13643543544
[2222222]
13211222122
12123123123
[3333333]
12341243123


实际操作实例:

脚本代码:

wKioL1nkJ9HyX428AAQW2j83Oyg956.png


文件内容:

wKiom1nkKoiCE0XhAALxP2oj-s4251.png


运行结果:

wKiom1nkKoqC1NmEAAQasWHSJZ4114.png



awk 合并一个文件 

http://ask.apelearn.com/question/493 

  我有这样的一个需求,需要把两个文件中,第一列相同的行合并到同一行中。举个例子,有两个文件,内容如下

wKioL1nkJ9WSskWFAAUc1ihWKnc377.png


现在我想要这个两个文件合并后的结果为:

1 ab aa
  2 cd bb
  3 ad ee
  4 bd ss
  5 de



实现这个需求的命令示例:

awk NR==FNR{a[$1]=$2}NR>FNR{print $0,a[$1]} 1.txt 2.txt

wKioL1nkJ9firmObAAOX2F_5fdY715.png


命令解释:NR表示的是读取的行数NR会一直累加FNR表示读取的当前行数先读完1.txt的行数再读2.txt的行数,所以其实NR==FNR 就表示读取1.txt的时候。 同理NR>FNR则表示读取2.txt的时候数组a其实就相当于一个map

  下面这种写法可能比较好读懂些:

wKiom1nkKo7zTMX-AANJyjq4Si8045.png


流程:

当读取1.txt时

第一行时:NR=0,FNR=0,

第二行时:NR=1,FNR=1,

……

最后一行时,NR=3,FNR=3,

然后开始读2.txt

2.txt第一行时,NR=4,FNR=0,此时NR>FNR,所以开始打印第一行1 ab aa

第二行时,NR=5,FNR=2,同样满足NR>FNR,所以开始打印第二行2 cd bb

……

2.txt最后一行时,NR=7,FNR=4,打印最后一行5 de

 

从上面我们发现几个特点:

1、第二个文件有几行,就打印几行,因为只有读到第二个文件时,才满足NR>FNR,才能打印

2、NR、FNR都是从零开始计数,NR不清零,FNR读完一个文件后清零

3、行号后面列的顺序是在print中定义的,也可以定义先打1.txt的$2列,后打2.txt的$2列,改为{print a[$1],$0}即可。


把一个文件多行连接成一行http://ask.apelearn.com/question/266 
  命令示例:

wKiom1nkKrSDvKkjAAWj9flC9to292.png


%s 后记得要有一空格,否则最后cat出来就是完全连在一起的,中间连空格都没有

 

应用举例:一个文件每行都有一个数字,现在需要把每行的数字用“+”连接起来文件内容如下:

wKioL1nkKAHSjsfsAAh8hiZCeTA184.png


命令示例:awk '{printf("%s+"),$0}' 1.txt; echo ""

wKiom1nkKreyL6ZOAAGGCxJCyEk506.png


这里注意,最后一个是带“+”的。所以echo "" 的作用是换行。


另外还有一个实现这个需求的方法

wKioL1nkKAKD-7yvAAJOO4BDYpo603.png



awk中gsub函数的使用http://ask.apelearn.com/question/200 
命令示例:

awk 'gsub(/root/,"abc")' passwd

这个命令是把passwd文件中所有root字符串替换为abc

wKiom1nkKrnBBR9wAANsei59f0Q776.png


awk -F ':' 'gsub(/root/,"abc",$1) {print $0}' passwd

 这个命令是把passwd文件中第一段root字符串替换为abc

wKiom1nkKrnhw0YcAAHmJmFal4k209.png


awk 'sub(/root/,"abc") {print $0}' passwd

这个命令是把passwd文件中第一次出现的root字符串替换为abc

wKioL1nkKAWTry1HAALQV8CVpuY512.png


awk 截取指定多个域为一行

http://ask.apelearn.com/question/224 
命令示例:

wKiom1nkKuSTf4ZzAAVjmIt69C0474.png



过滤两个或多个关键词

http://ask.apelearn.com/question/198 
命令示例:

grep -E '123|abc' filename


这个命令可以找出文件(filename)中包含123或者包含abc的行

wKioL1nkKC7Bji1dAAMJMQ9hSyc422.png


egrep '123|abc' filename

egrep同样可以实现

wKiom1nkKuXiMdA6AAMSYoR8pXs519.png


awk '/123|abc/' filename

awk 的实现方式

wKiom1nkKueQUS1gAALLlV6m-O4768.png



awk生成以下结构文件http://ask.apelearn.com/question/5494 

需求:

wKioL1nkKDKyN3NJAAUviv3BGSk916.png



使用shell脚本完成这个需求:

1. #! /bin/bash

2. 

3. for i in `seq 1 5000000`; do

4.     n=`echo "$i"|awk '{print length($0)}'`

5.     export m=$[10-$n]

6.     export o=`perl -e '$a='0'; $b=$a x $ENV{"m"}; print $b;'`

7.     export j=$i

8.     p=`perl -e '$c=$ENV{"o"}.$ENV{"j"}; print $c;'`

9.     echo "$i,$i,$p,$p,$p,$p,$p,$p,`date +%Y%m%d%H%M%S`"

        10. done

wKioL1nkKDWC9JOJAAatNUfPmGY324.png

其中用到了perl,所以脚本整体看起来比较啰嗦,希望能找到更好的解决办法。
PS: shell 执行效率很低,so 该脚本运行时间会很漫长!



awk用print打印单http://ask.apelearn.com/question/1738 
命令示例:

awk '{print "This is a '"'"'"$1} filename 
解释一下:在awk中使用脱义字符\是起不到作用的,如果想打印特殊字符,只能使用'""' 这样的组合才可以。这里自左至右为单引号 双引号 双引号 单引号其中两个单引号为一对,两个双引号为一对。想脱义$那就是'"$"' 脱义单引号那就是 '"'"'

wKioL1nkKDyCo5w3AA98djwEOgA563.png



合并两个文           

http://ask.apelearn.com/question/945 

命令示例:paste filename1 filename

示例,我现在有两个文件内容如下:

wKioL1nkKF_jYbmSAAOtv7f4oRY216.png


paste 1.txt 2.txt的结果为:

wKiom1nkKxaySlXgAALcIoMw_0w425.png


如果你想在两个文件连接处用一个指定的字符连接,还可以使用-d选项来指定:

命令示例:paste -d -1.txt 2.txt

运行结果:

wKioL1nkKGHzkHRKAAMccAxN-UM722.png




本文转自 ZeroOne01 51CTO博客,原文链接:http://blog.51cto.com/zero01/1972740,如需转载请自行联系原作者

相关文章
|
NoSQL 关系型数据库 Java
实时计算 Flink版产品使用问题之如何使用Flink MongoDB Connector连接MongoDB
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
算法 计算机视觉
指针式仪表的表盘自动识别算法
指针式仪表的表盘自动识别算法
2311 0
指针式仪表的表盘自动识别算法
|
Unix Linux
如何免费在线试用 200+ Linux 和 Unix 发行版?
Linux 和 Unix 都有着各种各样的发行版,有的界面美观,有的功能强大。如果你想要尝试不同的 Linux 和 Unix 发行版,传统的作法是先在本地安装对应版本,再进行体验。这样效率非常低下,不仅需要下载镜像,还要进行安装,比较费时。
656 0
如何免费在线试用 200+ Linux 和 Unix 发行版?
|
XML JSON 缓存
Java实现商品淘口令真实Url获取淘宝商品ID数据方法
Java实现商品淘口令真实Url获取淘宝商品ID数据方法
|
机器学习/深度学习 传感器 算法
【通信】非正交多址接入(NOMA)和正交频分多址接入(OFDMA)的性能对比附matlab代码
【通信】非正交多址接入(NOMA)和正交频分多址接入(OFDMA)的性能对比附matlab代码
|
存储 SQL 数据库
模式,外模式,内模式,数据定义语言,数据操纵语言
定义并解释以下术语:模式,外模式,内模式,数据定义语言,数据操纵语言。 模式、外模式、内模式,亦称逻辑模式,是数据库中全体数据的逻辑结构和特征的描述,是所有用户的公共数据视图。 模式:描述的是数据的全局逻辑结构。 外模式:涉及的是数据的局部逻辑结构,通常是模式的子集。 内模式,亦称存储模式,是数据在数据库系统内部的表示,即对数据的物理结构和存 储方式的描述。 DDL:数据定义语言,用来定义数据库模式、外模式、内模式的语言。 DML:数据操纵语言,用来对数据库中的数据进行查询、插入、删除...
836 0
|
移动开发 前端开发 JavaScript
xy哥怒肝,前端学习路线一条龙【内含入门到进阶到高级精选资源】无套路获取!!!
xy哥怒肝,前端学习路线一条龙【内含入门到进阶到高级精选资源】无套路获取!!!
|
存储 数据采集 资源调度
第五代蜂窝通信的系统要求 | 带你读《5G非正交多址技术》之二
与前四代不同的是,5G 的应用十分多样化。峰值速率和平均小区频谱效率 不再是唯一的要求。除此之外,体验速率、连接数、低时延、高可靠、高能效都将成为系统设计的重要考量因素。应用场景也不只是广域覆盖,还包括密集 热点、机器间通信、车联网、大型露天集会、地铁等。这也决定了 5G 中的技 术是多元的,不会像前几代那样,每一代都有唯一一个标志性技术。就多址技 术而言,5G 的一大特点是采用非正交资源。
第五代蜂窝通信的系统要求  | 带你读《5G非正交多址技术》之二
|
SQL 存储 机器学习/深度学习
MaxCompute 湖仓一体方案最佳实践 | 学习笔记
快速学习 MaxCompute 湖仓一体方案最佳实践
840 0
MaxCompute  湖仓一体方案最佳实践 | 学习笔记