正则复习2
笔记内容: lawk中使用外部shell变量 lawk 合并一个文件 l把一个文件多行连接成一行 lawk中gsub函数的使用 lawk截取指定多个域为一行 l过滤两个或多个关键词 l用awk生成以下结构文件 lawk用print打印单引号 l合并两个文件 笔记日期:
扩展 说明:-v选项用于定义参数,这里表示将变量A的值赋予GET_A。有多少个变量需要赋值,就需要多少个-v选项。与之等价的:应用于脚本中: 文件内容: 运行脚本后结果为:[2222211]1344325345613643543544[2222222]1321122212212123123123[3333333]12341243123
实际操作实例: 脚本代码: 文件内容: 运行结果: awk合并一个文件 http://ask.apelearn.com/question/493 我有这样的一个需求,我需要把两个文件中,第一列相同的行合并到同一行中。举个例子,有两个文件,内容如下 现在我想要这个两个文件合并后的结果为:
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 命令解释:NR表示的是读取的行数(NR会一直累加),FNR则表示读取的当前行数,先读完1.txt的行数再读2.txt的行数,所以其实NR==FNR 就表示读取1.txt的时候。 同理NR>FNR则表示读取2.txt的时候数组a其实就相当于一个map。 下面这种写法可能比较好读懂些: 流程:
当读取1.txt时 第一行时:NR=0,FNR=0, 第二行时:NR=1,FNR=1,255);">…… 最后一行时,NR=3,FNR=3,255);">然后开始读2.txt 读2.txt第一行时,NR=4,此时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}即可。
%s 后记得要有一个空格,否则最后cat出来就是完全连在一起的,中间连空格都没有
应用举例:一个文件每行都有一个数字,现在需要把每行的数字用“+”连接起来,文件内容如下: 命令示例:awk '{printf("%s+"),$0}' 1.txt; echo "" 这里注意,最后一个是带“+”的。所以echo ""的作用是换行。 另外还有一个实现这个需求的方法: awk中gsub函数的使用http://ask.apelearn.com/question/200 awk 'gsub(/root/,"abc")' passwd 这个命令是把passwd文件中所有的root字符串替换为abc: awk -F ':' 'gsub(/root/,"abc",$1) {print $0}' passwd passwd文件中第一段的root字符串: awk 'sub(/root/,"abc") {print $0}' passwd
passwd文件中第一次出现的: awk截取指定多个域为一行 http://ask.apelearn.com/question/224 过滤两个或多个关键词 http://ask.apelearn.com/question/198 grep -E '123|abc' filename
这个命令可以找出文件(filename)中包含123或者包含abc的行: egrep '123|abc' filename 用egrep同样可以实现: awk '/123|abc/'filename awk 的实现方式: 用awk生成以下结构文件http://ask.apelearn.com/question/5494 需求: 使用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,`date +%Y%m%d%H%M%S`" 10.done 其中用到了perl,所以脚本整体看起来比较??嗦,希望能找到更好的解决办法。 awk用print打印单引号http://ask.apelearn.com/question/1738 awk '{print "This is a '"'"'"$1} filename解释一下:在awk中使用脱义字符是起不到作用的,如果想打印特殊字符,只能使用'""' 这样的组合才可以。这里自左至右为单引号 双引号 双引号 单引号其中两个单引号为一对,两个双引号为一对。想脱义$那就是'"$"' 脱义单引号那就是 '"'"' 合并两个文件 http://ask.apelearn.com/question/945 命令示例:paste filename1 filename 示例,我现在有两个文件内容如下: paste 1.txt 2.txt的结果为: 如果你想在两个文件连接处用一个指定的字符连接,还可以使用-d选项来指定: 命令示例:paste -d ‘-’1.txt 2.txt 运行结果: awk的参考教程 http://www.cnblogs.com/emanlee/p/3327576.html (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |