9.7 awk复习、拓展

## 1. awk 中使用外部shell变量 http://ask.apelearn.com/question/199
- awk 中使用外部shell变量

变量 shell awk
如:
A=44echo "ABCD" | awk -v GET_A=$A ’{print GET_A}’
说明:-v选项用于定义参数,这里表示将变量A的值赋予GET_A。
有多少个变量需要赋值,就需要多少个-v选项。与之等价的:应用于脚本中:
```
#! /bin/bash
sort -n filename |awk -F ‘:‘ ‘{print $1}‘|uniq >id.txt
for id in `cat id.txt`; do
        echo "[$id]"
        awk -v id2=$id -F ‘:‘ ‘$1==id2 {print $2}‘ filename  // 另外的方式为: awk -F ‘:‘ ‘$1=="‘id‘" {print $2}‘ filename  
done
附件:
cat filename
1111111:13443253456
2222222:13211222122
1111111:13643543544
3333333:12341243123
2222222:12123123123
运行脚本后结果为:
[1111111]
13443253456
13643543544
[2222222]
13211222122
12123123123
[3333333]
12341243123
```

## 2. awk 合并一个文件 http://ask.apelearn.com/question/493
- awk 合并一个文件

awk
我有这样的需求,需要把两个文件中,第一列相同的行合并到同一行中。举个例子,有两个文件,内容如下
```
cat 1.txt
1 aa
2 bb
3 ee
4 ss

cat 2.txt
1 ab
2 cd
3 ad
4 bd
5 de

合并后的结果为:

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表示读取的行数,FNR表示读取的当前行数
所以其实NR==FNR 就表示读取2.txt的时候。 同理NR>FNR表示读取1.txt的时候
数组a其实就相当于一个map

## 3. 把一个文件多行连接成一行 http://ask.apelearn.com/question/266

- 把一个文件多行连接成一行
a=`cat file`;echo $a 
awk ‘{printf("%s ",$0)}‘ file   // %s 后记得要有一空格,否则出来就是完全连在一起的,中间连空格都没有
cat file |xargs

举例
应用举例:一个文件每行都有一个数字,现在需要把每行的数字用“+”连接起来。
```
cat a
96
1093
1855
1253
1364
1332
2308
2589
2531
1239
2164
2826
2787
2145
2617
4311
1810
2115
1235

awk ‘{printf ("%s+",$0)}‘  a; echo ""
96+1093+1855+1253+1364+1332+2308+2589+2531+1239+2164+2826+2787+2145+2617+4311+1810+2115+1235+
```
这里注意,最后一个是带“+”的。echo ""  的作用是换行。

另外的方法是 
cat a|xargs|sed ‘s/ /+/g‘
96+1093+1855+1253+1364+1332+2308+2589+2531+1239+2164+2826+2787+2145+2617+4311+1810+2115+1235

linux下的计算器  gdb
```
GNU gdb 6.8-debian
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
(gdb) p 478+3677+1866+2141+2199+1776+3359+3383+5326+2049+3560+2608+3682+5549+6122+6150+9966+3756+1943
$1 = 69590
```
// 注意,这里的p后面不是回车,是空格

现在了解了python,其实直接可以用python去计算,更加简单
只要输入 python,然后输入
```
478+3677+1866+2141+2199+1776+3359+3383+5326+2049+3560+2608+3682+5549+6122+6150+9966+3756+1943
即可

[[email protected] python]# python
Python 2.4.3 (#1, Jul 27 2009, 17:57:39)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-44)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 478+3677+1866+2141+2199+1776+3359+3383+5326+2049+3560+2608+3682+5549+6122+6150+9966+3756+1943
69590
>>>
```

## 4. awk中gsub函数的使用 http://ask.apelearn.com/question/200
awk中gsub函数的使用
awk ‘gsub(/www/,"abc")‘ /etc/passwd  // passwd文件中把所有www替换为abc
awk -F ‘:‘ ‘gsub(/www/,"abc",$1) {print $0}‘ /etc/passwd  // 替换$1中的www为abc

## 5. awk 截取指定多个域为一行 http://ask.apelearn.com/question/224

awk 截取指定多个域为一行
```

for j in `seq 0 20`; do
        let x=100*$j
        let y=$x+1
        let z=$x+100
        for i in `seq $y $z` ; do
                awk  -v a=$i ‘{printf $a " "}‘ example.txt >>/tmp/test.txt
                echo " " >>/tmp/test.txt
        done
done

```

## 6. 过滤两个或多个关键词 http://ask.apelearn.com/question/198

- grep 或 egrep 或awk 过滤两个或多个关键词
grep -E ‘123|abc‘ filename  // 找出文件(filename)中包含123或者包含abc的行
egrep ‘123|abc‘ filename    //用egrep同样可以实现
awk ‘/123|abc/‘  filename // awk 的实现方式

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

- [求助]用awk编写生成以下结构文件的程序

用awk编写生成以下结构文件的程序。( 最后列使用现在的时间,时间格式为YYYYMMDDHHMISS)  各列的值应如下所示,每增加一行便加1,共500万行。

1,1,0000000001,0000000001,0000000001,0000000001,0000000001,0000000001,2005100110101
2,2,0000000002,0000000002,0000000002,0000000002,0000000002,0000000002,2005100110101

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

## 9. 合并两个文件 http://ask.apelearn.com/question/945

把两个文件中相同的行合并成一行

六期课程
paste  filename1  filename2 

这样就可以实现了。举个例子。
```
cat  a.txt
1 2 3 
4 5 6 
a b c

cat b.txt
3 2 1 
6 5 4 
c b a 

则  paste  a.txt  b.txt  结果为
1 2 3   3 2 1
4 5 6   6 5 4
a b c   c b a

如果,你想在两个文件连接处用一个指定的字符连接,还可以用-d来指定
paste -d ‘+‘  a.txt b.txt
结果为
1 2 3+3 2 1
4 5 6+6 5 4
a b c+c b a
```

## 10. awk的参考教程 http://www.cnblogs.com/emanlee/p/3327576.html
- awk 用法:awk ‘ pattern {action} ‘  

变量名    含义 
ARGC   命令行变元个数 
ARGV   命令行变元数组 
FILENAME   当前输入文件名 
FNR   当前文件中的记录号 
FS   输入域分隔符,默认为一个空格 
RS   输入记录分隔符 
NF   当前记录里域个数 
NR   到目前为止记录数 
OFS   输出域分隔符 
ORS   输出记录分隔符 
```
1、awk ‘/101/‘    file      显示文件file中包含101的匹配行。 
   awk ‘/101/,/105/‘  file 
   awk ‘$1 == 5‘    file 
   awk ‘$1 == "CT"‘    file    注意必须带双引号 
   awk ‘$1 * $2 >100 ‘   file  
   awk ‘$2 >5 && $2<=15‘  file

2、awk ‘{print NR,NF,$1,$NF,}‘ file     显示文件file的当前记录号、域数和每一行的第一个和最后一个域。 
   awk ‘/101/ {print $1,$2 + 10}‘ file       显示文件file的匹配行的第一、二个域加10。 
   awk ‘/101/ {print $1$2}‘  file 
   awk ‘/101/ {print $1 $2}‘ file       显示文件file的匹配行的第一、二个域,但显示时域中间没有分隔符。

```
3、df | awk ‘$4>1000000 ‘         通过管道符获得输入,如:显示第4个域满足条件的行。

4、awk -F "|" ‘{print $1}‘   file         按照新的分隔符“|”进行操作。 
   awk  ‘BEGIN { FS="[: \t|]" } 
   {print $1,$2,$3}‘       file         通过设置输入分隔符(FS="[: \t|]")修改输入分隔符。 

   Sep="|" 
   awk -F $Sep ‘{print $1}‘  file   按照环境变量Sep的值做为分隔符。    
   awk -F ‘[ :\t|]‘ ‘{print $1}‘ file   按照正则表达式的值做为分隔符,这里代表空格、:、TAB、|同时做为分隔符。 
   awk -F ‘[][]‘    ‘{print $1}‘ file   按照正则表达式的值做为分隔符,这里代表[、]

5、awk -f awkfile    file         通过文件awkfile的内容依次进行控制。 
   cat awkfile 
/101/{print "\047 Hello! \047"}    --遇到匹配行以后打印 ‘ Hello! ‘.  \047代表单引号。 
{print $1,$2}                      --因为没有模式控制,打印每一行的前两个域。

6、awk ‘$1 ~ /101/ {print $1}‘ file         显示文件中第一个域匹配101的行(记录)。

7、awk   ‘BEGIN { OFS="%"} 
   {print $1,$2}‘  file           通过设置输出分隔符(OFS="%")修改输出格式。

8、awk   ‘BEGIN { max=100 ;print "max=" max}             BEGIN 表示在处理任意行之前进行的操作。 
   {max=($1 >max ?$1:max); print $1,"Now max is "max}‘ file           取得文件第一个域的最大值。 
   (表达式1?表达式2:表达式3 相当于: 
   if (表达式1) 
       表达式2 
   else 
       表达式3 
   awk ‘{print ($1>4 ? "high "$1: "low "$1)}‘ file 

9、awk ‘$1 * $2 >100 {print $1}‘ file         显示文件中第一个域匹配101的行(记录)。

10、awk ‘{$1 == ‘Chi‘ {$3 = ‘China‘; print}‘ file        找到匹配行后先将第3个域替换后再显示该行(记录)。 
    awk ‘{$7 %= 3; print $7}‘  file           将第7域被3除,并将余数赋给第7域再打印。

11、awk ‘/tom/ {wage=$2+$3; printf wage}‘ file          找到匹配行后为变量wage赋值并打印该变量。

12、awk ‘/tom/ {count++;}  
         END {print "tom was found "count" times"}‘ file            END表示在所有输入行处理完后进行处理。

13、awk ‘gsub(/\$/,"");gsub(/,/,""); cost+=$4; 
         END {print "The total is $" cost>"filename"}‘    file             gsub函数用空串替换$和,再将结果输出到filename中。 
    1 2 3 $1,200.00 
    1 2 3 $2,300.00 
    1 2 3 $4,000.00 

    awk ‘{gsub(/\$/,"");gsub(/,/,""); 
    if ($4>1000&&$4<2000) c1+=$4; 
    else if ($4>2000&&$4<3000) c2+=$4; 
    else if ($4>3000&&$4<4000) c3+=$4; 
    else c4+=$4; } 
    END {printf  "c1=[%d];c2=[%d];c3=[%d];c4=[%d]\n",c1,c2,c3,c4}"‘ file 
    通过if和else if完成条件语句 

    awk ‘{gsub(/\$/,"");gsub(/,/,""); 
    if ($4>3000&&$4<4000) exit; 
    else c4+=$4; } 
    END {printf  "c1=[%d];c2=[%d];c3=[%d];c4=[%d]\n",c1,c2,c3,c4}"‘ file 
    通过exit在某条件时退出,但是仍执行END操作。 
    awk ‘{gsub(/\$/,"");gsub(/,/,""); 
    if ($4>3000) next; 
    else c4+=$4; } 
    END {printf  "c4=[%d]\n",c4}"‘ file 
    通过next在某条件时跳过该行,对下一行执行操作。 

14、awk ‘{ print FILENAME,$0 }‘ file1 file2 file3>fileall              把file1、file2、file3的文件内容全部写到fileall中,格式为 
    打印文件并前置文件名。

15、awk ‘ $1!=previous { close(previous); previous=$1 }    
    {print substr($0,index($0," ") +1)>$1}‘ fileall           把合并后的文件重新分拆为3个文件。并与原文件一致。

16、awk ‘BEGIN {"date"|getline d; print d}‘         通过管道把date的执行结果送给getline,并赋给变量d,然后打印。 

17、awk ‘BEGIN {system("echo \"Input your name:\\c\""); getline d;print "\nYour name is",d,"\b!\n"}‘ 
    通过getline命令交互输入name,并显示出来。 
    awk ‘BEGIN {FS=":"; while(getline< "/etc/passwd" >0) { if($1~"050[0-9]_") print $1}}‘ 
    打印/etc/passwd文件中用户名包含050x_的用户名。 
```
18、awk ‘{ i=1;while(i<NF) {print NF,$i;i++}}‘ file 通过while语句实现循环。 
    awk ‘{ for(i=1;i<NF;i++) {print NF,$i}}‘   file 通过for语句实现循环。     
    type file|awk -F "/" ‘ 
    { for(i=1;i<NF;i++) 
    { if(i==NF-1) { printf "%s",$i } 
    else { printf "%s/",$i } }}‘               显示一个文件的全路径。 
    用for和if显示日期 
    awk  ‘BEGIN { 
for(j=1;j<=12;j++) 
{ flag=0; 
  printf "\n%d月份\n",j; 
        for(i=1;i<=31;i++) 
        { 
        if (j==2&&i>28) flag=1; 
        if ((j==4||j==6||j==9||j==11)&&i>30) flag=1; 
        if (flag==0) {printf "%02d%02d ",j,i} 
        } 
} 
}‘

```
19、在awk中调用系统变量必须用单引号,如果是双引号,则表示字符串 
Flag=abcd 
awk ‘{print ‘$Flag‘}‘   结果为abcd 
awk ‘{print  "$Flag"}‘   结果为$Flag

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

$ awk ‘BEGIN{total=0}{total+=$4}END{print total}‘ a.txt   -----对a.txt文件的第四个域进行求和!

$ awk ‘/^(no|so)/‘ test      -----打印所有以模式no或so开头的行。

$ awk ‘/^[ns]/{print $1}‘ test       -----如果记录以n或s开头,就打印这个记录。

$ awk ‘$1 ~/[0-9][0-9]$/(print $1}‘ test     -----如果第一个域以两个数字结束就打印这个记录。

$ awk ‘$1 == 100 || $2 < 50‘ test      -----如果第一个或等于100或者第二个域小于50,则打印该行。

$ awk ‘$1 != 10‘ test    -----如果第一个域不等于10就打印该行。

$ awk ‘/test/{print $1 + 10}‘ test  -----如果记录包含正则表达式test,则第一个域加10并打印出来。

$ awk ‘{print ($1 > 5 ? "ok "$1: "error"$1)}‘ test   -----如果第一个域大于5则打印问号后面的表达式值,否则打印冒号后面的表达式值。

$ awk ‘/^root/,/^mysql/‘ test        ----打印以正则表达式root开头的记录到以正则表达式mysql开头的记录范围内的所有记录。如果找到一个新的正则表达式root开头的记录,则继续打印直到下一个以正则表达式mysql开头的记录为止,或到文件末尾。
时间: 2024-07-30 17:23:05

9.7 awk复习、拓展的相关文章

算法复习——拓展欧几里得(poj1061)

题目: Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的具体位置.不过青蛙们都是很乐观的,它们觉得只要一直朝着某个方向跳下去,总能碰到对方的.但是除非这两只青蛙在同一时间跳到同一点上,不然是永远都不可能碰面的.为了帮助这两只乐观的青蛙,你被要求写一个程序来判断这两只青蛙是否能够碰面,会在什么时候碰面. 

【数学】【数论】拓展中国剩余定理

写在前面 记录了个人的学习过程,同时方便复习 拓展中国剩余定理 [?]中国剩余定理仅仅适用于每个模数两两互质的情况 但是最常见的情况还是所有模数不满足两两互质 这样的话,中国剩余定理就不再适用 需要使用拓展中国剩余定理 中国剩余定理的思路是整体处理 但是当模数不满足两两互素时,就不能处理其中关键的一步: (详见[?]中国剩余定理) 不满足两两互素,即某些模数之间的最大公因数不是1,解出的方程余数不为1 所以拓展中国剩余定理使用的是另一种思路: 逐个处理,直至出现无解情况或者结束! 原文地址:ht

Linux学习笔记7_基本命令复习2(seq sed awk)

命令运用:显示文件的20到30行的内容 ------------------------------------------------- seq 生成序列 seq 100 >[file name]  生成1~100的行序列: 1 2 3 ... 100 注: 上述只限定最大值时,序列从1开始 seq  0  100   则从0开始,序列顺序遵循自然数顺序 seq -1  100   从-1开始: -1 0 1 ...100 -----------------------------------

awk 部分 cut部分 &&网络部分复习

<<"com" shell file and  learn awk name        Chinese   Maths English wz           55       77      96       wzzx         66       66      69 sts          77       55      88 com awk '{print ($2+$3+$4)}' log  #  #0 #228 #201 #220  awk '{pr

linux笔记(28)sed和awk的联系及拓展

sed练习题 把/etc/passwd 复制到/root/test.txt,用sed打印所有行 [[email protected] sed]# sed -n '1,$p' passwd 打印test.txt的3到10行 [[email protected] sed]# sed -n '3,10'p passwd 打印test.txt 中包含 'root' 的行 [[email protected] sed]# sed -n '/root/'p passwd 删除test.txt 的15行以及以

9.7 sed复习、拓展

复习  扩展 打印某行到某行之间的内容http://ask.apelearn.com/question/559 sed转换大小写 http://ask.apelearn.com/question/7758 sed在某一行最后添加一个数字http://ask.apelearn.com/question/288 删除某行到最后一行 http://ask.apelearn.com/question/213 打印1到100行含某个字符串的行 http://ask.apelearn.com/questio

awk 相关的复习

1. awk 引用外部变量: aa=666  echo "." | awk -v GET_A=$aa '{print GET_A}' . sort -n fuxi.awk |awk -F ':' '{print $1}'|uniq >id.txt[[email protected]_year awk]# for id in `cat id.txt`; do> echo "[$id]"> awk -v id2=$id -F ':' '$1==id2

python拓展1 week1-week5复习回顾

知识内容: 1.python基础概念及基础语法 2.python基础数据类型 3.python模块相关 4.python函数相关 5.python面向对象相关 6.python文件处理相关 一.python基础概念及基础语法 1.python是一门什么样的语言,有何优缺点,有哪些应用领域? 2.python中的变量有何作用,该如何合理地命名? 3.解释一下python的and-or语法 4.python是如何进行内存管理的? 5.python中变量作用域有哪些?如何查看作用域? 6.Python

轻松上手 正则表达式与grep,sed,awk(一)

一些废话: 对于正则表达式,一直都是似懂非懂,看到一些代码,脚本中带有正则,awk,sed,心里总有点虚.主要是记不住,平时又没怎么用,也就没总结了.现在有空,决定总结一下,顺便克服一下看到shell,js这些带有正则就心虚的弱点.打算分三篇文章来写 正文: 一般来说,正则分好几种,但基本都差不多,我所了解的有 "基本正则","扩展正则"及"perl正则",本文更偏向说记录"基本正则"和"扩展正则",它们在