awk

http://blog.51yip.com/shell/1151.html  awk中RS,ORS,FS,OFS区别与联系


http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=1354674&page=1  RS、ORS、FS、OFS相关问题  


http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=2309494&extra=page%3D1%26filter%3Ddigest%26digest%3D1%26digest%3D1  awk初学之常见问题


http://www.cnblogs.com/repository/archive/2011/05/13/2045927.html 常用awk命令


http://bbs.chinaunix.net/thread-2312439-1-1.html awk数组的学习心得


http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=1790335&fromuid=25585124 文本编辑的一点心得--awk篇


http://lxw66.blog.51cto.com/5547576/1207720 awk数组和循环


http://www.linuxidc.com/Linux/2012-06/63662.htm awk数组嵌套筛选数据


http://www.cnblogs.com/serendipity/archive/2011/08/01/2124118.html  AWK命令介绍


http://wenku.baidu.com/view/dd0c17c689eb172ded63b72d.html awk 字符串函数


http://bbs.chinaunix.net/thread-605570-1-1.html Regular Expression 简介(正则表达式)


http://hooopo.iteye.com/blog/407062 正则表达式�C零宽断言详解


http://hi.baidu.com/david0128/item/230d0f15bd96f4debf90420a awk使用NR和FNR的一些例子


http://blog.chinaunix.net/uid-10540984-id-313282.html Linux shell 正则表达式(BREs,EREs,PREs)差异比较


http://bbs.chinaunix.net/thread-1857159-1-1.html awk之选择性打印


1.

# cat test1
111 222
333 444
555 666

#awk -v OFS="|" '{NF=NF;print $0}' test1
111|222
333|444
555|666

# awk 'BEGIN {OFS="|"} {$2=$2;print $0}' test1
111|222
333|444
555|666

2.

echo 0 1 2 3 | awk -v OFS="\t" '$1=$1'
啥都没输出有木有

应该 echo 0 1 2 3 | awk -v OFS="\t" '($1=$1)||1'


3.

cat  file:
#
1
2
3
#
4
5
6
#
6
7
8
9
#

如何输出成:
123
45
6789


(1)awk -v RS=# 'NF{printf $1;for(i=2;i<=NF;i++)if($i) printf ","$i;print ""}' file
1,2,3
4,5
6,7,8,9

(2)awk 'BEGIN{RS="#";OFS=","}NF&&$1=$1' urfile

或者awk 'BEGIN{RS="#";OFS=","}NF{$NF=$NF;print $0}' urfile

 

或者awk -v RS="#" 'NR==2{print $1$2$3"\n"}NR==3{print $1$2"\n"}NR==4{print $1$2$3$4}'


4.

现有一文件,内包含数字
$cat file.txt

This is a 233 test !
only test 339833.
25 includes.
1 file.
补充一条,文件中存在一行多数字的记录。不好意思。如
line 5 here 6 num , sub 345677 ?
要做个脚本,把出现过的数字加和。


(1).awk '{gsub(/[^0-9]*/,"");s+=$0}END{print s}'

(2).awk -v RS='[0-9]+' '{s+=RT}END{print s}' file


gsub:

cat file

This is a 233 test!

only test 339833.

25 includes.

1 file.


awk 'gsub(/test/,"peep")1' file

This is a 233 peep!

only peep 339833.

25 includes.

1 file.


awk 'gsub(/test/,"peep"){print $0}' file

This is a 233 peep!

only peep 339833.


cat file

#1374848290

df -h

#1373845293

free -m

#1376945197

ifconfig


awk '/#/{gsub(/[0-9]+/,"peep");print}' file

#peep

#peep

#peep


awk '{gsub(/[0-9]+/,"peep");print}' file

#peep

df -h

#peep

free -m

#peep

ifconfig


substr(s,p)         返回字符串s中从p开始的后缀部分

substr(s,p,n)       返回字符串s中从p开始长度为n的后缀部分


5.

file1
abc
cde


file2
abc
bce


如何拉出file1中有,而file2中没有的行?


1.awk 'NR==FNR{a[$0]=1}NR>FNRif(!(a[$0])) {print }}'  file2 file1

2.grep -vxFf file2 file1

3.awk 'NR==FNR{a[$1]=$1}NR>FNR{if(!($1 in a)){print $1}}' file2 file1

4.awk 'NR==FNR{a[$1]++}NR>FNR&&!a[$1]++' file2 file1

5.awk 'ARGIND==1{a[$0]}ARGIND>1&&!($0 in a){print $0}' file2 file1



6.

awknext语句使用:在循环逐行匹配,如果遇到next,就会跳过当前行,直接忽略下面语句。而进行下一行匹配。


text.txt 内容是:

a

b

c

d

e


awk 'NR%2==1{next}{print NR,$0;}' text.txt    

2 b

4 d

当记录行号除以2余 1,就跳过当前行。下面的print NR,$0也不会执行。 下一行开始,程序有开始判断NR%2 值。这个时候记录行号是:2 ,就会执行下面语句块:'print NR,$0'


awk '{getline;print NR,$0}' text.txt

2 b

4 d



cat a

112312412

124312312452100000

4231433234

1241

412141

14233423423

212189

98079076

79978

a

b


awk 'NR%2==1{print NR,$0}' a

1 112312412

3 4231433234

5 412141

7 212189

9 79978

11 b


awk 'NR%2{print NR,$0}' a

1 112312412

3 4231433234

5 412141

7 212189

9 79978

11 b


awk '!(NR%2){print NR,$0}' a

2 124312312452100000

4 1241

6 14233423423

8 98079076

10 a


awk '!(NR%3){print NR,$0}' a

3 4231433234

6 14233423423

9 79978


7.

文件:text.txt 格式:

web01[192.168.2.100]

httpd            ok

tomcat               ok

sendmail               ok

web02[192.168.2.101]

httpd            ok

postfix               ok

web03[192.168.2.102]

mysqld            ok

httpd               ok


需要通过awk将输出格式变成:

web01[192.168.2.100]:   httpd            ok

web01[192.168.2.100]:   tomcat               ok

web01[192.168.2.100]:   sendmail               ok

web02[192.168.2.101]:   httpd            ok

web02[192.168.2.101]:   postfix               ok

web03[192.168.2.102]:   mysqld            ok

web03[192.168.2.102]:   httpd               ok


分析:

分析发现需要将包含有“web”行进行跳过,然后需要将内容与下面行合并为一行。

[chengmo@centos5 shell]$ awk '/^web/{T=$0;next;}{print T":\t"$0;}' test.txt

web01[192.168.2.100]:   httpd            ok

web01[192.168.2.100]:   tomcat               ok

web01[192.168.2.100]:   sendmail               ok

web02[192.168.2.101]:   httpd            ok

web02[192.168.2.101]:   postfix               ok

web03[192.168.2.102]:   mysqld            ok

web03[192.168.2.102]:   httpd               ok


8.

getline为awk所提供的输入命令

如果找到一条记录则getline返回1,如果到了文件结束(EOF)则返回0,如果错误则返回-1

A.getline从整体上来说,应这么理解它的用法:

当其左右无重定向符 | 或 < 时,getline作用于当前文件,读入当前文件的第一行给其后跟的变量var 或$0(无变量);应该注意到,由于awk在处理getline之前已经读入了一行,所以getline得到的返回结果是隔行的。

当其左右有重定向符 | 或 < 时,getline则作用于定向输入文件,由于该文件是刚打开,并没有被            awk读入一行,只是getline读入,那么getline返回的是该文件的第一行,而不是隔行。

B.getline用法大致可分为三大类(每大类又分两小类),即总共有6种用法。代码如下:

QUOTE:

awk ‘BEGIN{“cat data.txt”|getline d; print d}’ data2.txt

awk ‘BEGIN{“cat data.txt”|getline; print $0}’ data2.txt  $0可以省略

awk ‘BEGIN{getline d < “data.txt”; print d}’ data2.txt

awk ‘BEGIN{getline < “data.txt”; print $0}’ data2.txt 此种方法不成立

     以上四行代码均实现“只打印data.txt文件的第一行”(若打印全部行,用循环)

eg. awk ‘BEGIN{FS=”:”;while(getline<”/etc/passwd”>0){print $1}}’ data.txt

awk ‘{getline; print $0”#”$3}’ data.txt

              awk首先读入第一行接着处理getline函数,然后把下一行指定给$0,现在的$0已经是下一行内容,后面的#和$3(从$0中取)会覆盖$0的内容。

awk getline接收用户输入,有两种形式:

getline string  < "/dev/tty"

getline string  < "-"

1)提示用户输入参数getline:awk 'BEGIN{print "input sth";getline var <"-" ; print var}'  # 其中 "-" 就是标准输入,很多工具都支持 "-" ,比如tar/cat等。

2)获取awk脚本的位置参数:awk 'BEGIN{print ARGV[1],ARGV[2]}' a b


getline怎样保存shell的全部输出:

awk 'BEGIN{srs=RS;RS="";"ls ./" | getline TMP;RS=srs;print TMP}'


getline 直接读取文件,注意BEGIN是预处理部分,不是action部分,此时还没有准备处理文件,指针

也没有指向文件第1行,在执行过程中也不会移动文件指针的。

简单的说就是BEGIN部分awk是没有指针的,此时只有getline指针,awk只在{ }action部分有指针处理。

awk 'BEGIN{ while (getline d<"aa") print d}'


seq 10|awk '{getline d<"aa";print d}'   #如果getline直接读一个文件,那么就是逐行读取的,

因为此时只有getline指针,而没有awk指针来处理该文件。

getline打印偶数行:

seq 10 | awk '{getline;print}'  # 注意这个和 seq 10 | awk 'BEGIN{while(getline)print}' 有区别!就是BEGIN部分awk是没有指针的,此时只有getline指针,awk只在{ }action部分有指针处理。

seq 10 | awk 'i++%2'


awk getline两行互换:

seq 10 | awk '{if(getline tmp)print tmp;print}'   #一般就是判断getline的返回值 > 0 的


9.

Cat file

1

2

3

4


getline取出第二、四行

awk '{getline}{print}' file


getline取出第一行

awk 'BEGIN{getline<"file2";print $0}'


next取出第二、四行

awk 'NR%2==1{next}{print $0}' file


10.题目

1.用awkgetline打印出与awk '{print NR}' /etc/passwd相同的结果

awk 'BEGIN{while("cat /etc/passwd"|getline)print ++i}'

或者 awk '{print ++n}getline{print ++n}'


2.第16


3.通过getline命令交互输入name,并显示出来

awk 'BEGIN{system("echo -e \"Input your name:\\c\"");getline d;print"\nYour name is",d,"\b!\n"}'

Input your name:caiyan


Your name is caiyan!

――――――――――――

\b     backspace

\c     suppress trailing newline



11.

awk 'BEGIN{"echo ok >&2"|getline;print ++i}'

ok

1

awk 'BEGIN{while("echo ok >&2"|getline)print ++i}'

ok

awk 'BEGIN{"echo ok"|getline;close("echo ok");print}'

ok


12.

cat file

112312412

124312312452100000

4231433234

1241

412141

14233423423

212189

98079076

79978

[root@centos6-1 ~]#


根据文本中最长位数的那行进行补齐,不足位数的后面补0

1.

awk 'NR==FNR{if(max<length($0))max=length($0);next}{while(length($0)<max)$0=$0"0"}1' file file

2.

awk '{a[NR]=$0;if(max<length($0))max=length($0)}END{for(i=1;i<=NR;i++){while(length(a[i])<max)a[i]=a[i]"0";print a[i]}}' file


13.

awk 'BEGIN{while("ls -l"|getline)print ++i}'

1

2

3

4


awk 'BEGIN{while("ls -l"|getline);print ++i}'

1


awk '{while("ls -l"|getline)print}' file2

总计 20

-rw-r--r-- 1 root root   0 12-02 22:29 file

-rw-r--r-- 1 root root 432 12-01 08:58 file1

-rw-r--r-- 1 root root  21 12-02 22:29 file2


awk '{while("ls -l"|getline);print}' file2

-rw-r--r-- 1 root root  21 12-02 22:29 file2

2

3

4

5

6

(cat file2

1

2

3

4

5

6)


14.

seq 10|awk '{if(getline tmp)print tmp;print}'

2

1

4

3

6

5

8

7

10

第一个记录是1 , 然后,getline取下一行 2 , 给tmp赋值,然后打印tmp ,同时打印 1,接着输入3 ,依次类推


15.

awk 'BEGIN{while("cat file2"|getline  d)print d}'

1

2

3

4

5

6


awk 'BEGIN{while(getline  d)print d}' file2

1

2

3

4

5

6


seq 10|awk '{while(getline tmp)print tmp;print}'

2

3

4

5

6

7

8

9

10

1

seq 10|awk '{if(getline tmp)print tmp;print}'

2

1

4

3

6

5

8

7

10


++++

三者的差别

awk '{getline tmp;print}' file2

1

3

5


awk '{getline tmp;print tmp}' file2

2

4

6

6

awk '{if(getline tmp)print tmp}' file2

2

4

6

++++


++++

两者的区别

cat file

wangwu

13512345678

[email protected]

wuhai,hubei


awk 'BEGIN{FS="\n";RS=""}{x=1;while(x<NF){print $x"\t";x++}}' file

wangwu

13512345678

[email protected]


awk 'BEGIN{FS="\n";RS="";ORS=""}{x=1;while(x<NF){print $x"\t";x++}}' file

wangwu13512345678[email protected]

++++


++++

三者的区别(a[$1的值看最后一行])

A.cat c

aaa 1

aaa 1

ccc 1

aaa 1

bbb 1

ccc 1


awk '{a[$1]+=$2}END{print a[$1],$1}' c

2 ccc

awk '{a[$1]+=$2}END{for(i in a)print i,a[$1]}' c

aaa 2

ccc 2

bbb 2

 

(awk '{a[$1]+=$2}{for(i in a)print a[$1]}'
1
2
1
1
3
3
1
1
1
2
2
2

 

awk '{a[$1]+=$2}{for(i in a){if(i=="aaa")print a[$1]}}'
1
2
1
3
1
2

 

awk '{a[$1]+=$2}{for(i in a){if(i=="bbb")print a[$1]}}'
1
2

 

awk '{a[$1]+=$2}{for(i in a){if(i=="ccc")print a[$1]}}'
1
3
1
2

)


B.cat c

aaa 1

aaa 1

ccc 1

aaa 1

ccc 1

bbb 1


awk '{a[$1]+=$2}END{print a[$1],$1}' c

1 bbb

awk '{a[$1]+=$2}END{for(i in a)print i,a[$1]}' c

aaa 1

ccc 1

bbb 1


C.cat c

aaa 1

aaa 1

ccc 1

bbb 1

ccc 1

aaa 1


awk '{a[$1]+=$2}END{print a[$1],$1}' c

3 aaa

awk '{a[$1]+=$2}END{for(i in a)print i,a[$1]}' c

aaa 3

ccc 3

bbb 3


D.cat c

1 abc

2 def

3 ghi

4 jlm


cat d

3 shit

1 rubb


awk 'NR==FNR{a[$1]=$0;print a[$1]}' c d

1 abc

2 def

3 ghi

4 jlm


awk 'NR==FNR{a[$1]=$0}{print a[$1]}' c d

1 abc

2 def

3 ghi

4 jlm

3 ghi

1 abc


awk 'NR==FNR{a[$1]=$0}NR>FNR{print a[$1]}' c d

3 ghi

1 abc


awk 'NR==FNR{a[$1]=$0}{print $0,a[1]}' c d

1 abc 1 abc

2 def 1 abc

3 ghi 1 abc

4 jlm 1 abc

3 shit 1 abc


例子:

cat a.txt

1 abc

2 def

3 ghi

4 jlm


cat b.txt

3 shit

1 rubb


awk 'NR==FNR{a[$1]=$0;next}NR>FNR{if($1 in a)print $0"\n"a[$1]}' a.txt b.txt

3 shit

3 ghi

1 rubb

1 abc


awk 'NR==FNR{a[$1]=$0;next}NR>FNR{for(i in a)if($1~i)print $0"\n"a[i]}' a.txt b.txt

3 shit

3 ghi

1 rubb

1 abc


cat file

0011AAA 200.00 20050321

0012BBB 300.00 20050621

0013DDD 400.00 20050622

0014FFF 500.00 20050401


awk '{a[substr($1,1,4)]=$0}{for(i in a)print a[i]}' file

0011AAA 200.00 20050321

0011AAA 200.00 20050321

0012BBB 300.00 20050621

0013DDD 400.00 20050622

0011AAA 200.00 20050321

0012BBB 300.00 20050621

0013DDD 400.00 20050622

0014FFF 500.00 20050401

0011AAA 200.00 20050321

0012BBB 300.00 20050621

++++


!!!!

小方法

打印偶数行:

   seq 10|awk 'i++%2'

  打印奇数行:

  seq 10|awk '++i%2'


取得文件第一个域的最大值:

awk '{max=($1>max?$1:max)}END{print max}' file

或者awk '{if(max<$1)max=$1}END{print max}' file


判断“高低”

awk '{a=($1>100?"high":"low");print $1,a}' file

awk '{print($1>100?"high":"low "$1)}' file1


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


awk 'BEGIN{system("date +%Y%m%d%H%M%S")}'

20131218071537

awk 'BEGIN{now=strftime("%F %T");print now}'

2013-12-18 07:15:49


假设有多行文本,想先找到包含“cron”和“test”的字符串,再排除“grep”,一条命令如何表达出来?

ps -ef|grep  -P "(cron|test)"|grep -v grep

ps -ef|grep -P "([c]ron|[t]est)"

ps -ef|grep "\([c]ron\|[p]ython\)"


echo "ab123cd313ef" | grep -o "[a-z][a-z]"

ab

cd

ef

多个匹配多行输出



echo "beijing123" |grep -Po 123


取得文件第一个域的最大值

awk '{max=($1>max?$1:max);print $1,"Now max is"max}' b

2128340 Now max is2128340

6787828 Now max is6787828

1845712 Now max is6787828

2747952 Now max is6787828

426060 Now max is6787828


awk '{b=(max>$1?max:$1);print b}' b

2128340

6787828

1845712

2747952

426060


awk '{$7 %= 3; print $7}'  file 将第7域被3除,并将余数赋给第7域再打印

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

awk '{$1 == 'Chi' {$3 = 'China'; print}' file 找到匹配行后先将第3个域替换后再显示该行(记录)

/101/{print "\047 Hello! \047"} --遇到匹配行以后打印 ' Hello! '.\047代表单引号

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

!!!!




16.

cat file

wangwu

13512345678

[email protected]

wuhai,hubei


awk 'BEGIN{FS="\n";RS="";ORS=""}{x=1;while(x<NF){print $x"\t";x++}print $NF"\n"}' file

wangwu  13512345678  [email protected]  wuhai,hubei


awk '{printf $0"\t"}END{print " "}' file

wangwu  13512345678  [email protected]  wuhai,hubei


17.

去除重复项

怎么列出b文件中完全不包含a文件的行??

解答: awk 'ARGIND==1 {a[$0]} ARGIND>1&&!($0 in a) {print $0}' a b

或者: awk 'NR==FNR {a[$0]} NR>FNR&&!($0 in a) {print $0}' a b


代码解释:

ARGIND==1{a[$0]}

#ARGIND==1 判断是否正在处理第一个文件,本例为文件a

# {a[$0]} 初始化(或叫做定义)a[$0]

ARGIND>1&&!($0 in a){print $0}

#ARGIND>1 判断是否在处理第二个或第n个文件,本例只有一个文件b

#并且判断a[$0]是否未定义,然后打印$0


18.

两者排序区别:

asort 是对数组的值进行排序,并且会丢掉原先键值;

asorti是对数组的下标进行排序。


数据文件:

12 34

78 90

23 45


1. awk是关联数组。for…in循环输出时候,默认打印出来是无序数组。

[root@zhenjiang ~]# awk '{a[$1]=$2}END{for(i in a) print i,a[i]}' test

78 90

12 34

23 45


2. asort排序输出

[root@zhenjiang ~]# awk '{a[$1]=$2}END{slen=asort(a,b);for(i=1;i<=slen;i++) print i"\t"a[i]"\t"b[i]}' test

134

245

390

在最后执行命令,END中 asort对数组a的值进行排序,把排序后的下标存入新生成的数组b中,丢弃数组a下标值,再把数组a的长度赋值给变量slen。

b[1]=34

b[2]=45

b[3]=90

此时a已经是空数组。

数组的值是无法直接print(输出)的,使用for循环取出数值的下标,输出排序后的数组b下标值及对应数值



3. asorti 排序输出

[root@zhenjiang ~]# awk '{a[$1]=$2}END{slen=asorti(a,b);for(i=1;i<=slen;i++) print i"\t"b[i]"\t"a[b[i]]}' test

11234

22345

37890

在最后执行命令,END中 asorti对数组a的下标进行排序,并把排序后的下标存入新生成的数组b中,并把数组a的长度赋值给变量l。

b[1]=12

b[2]=23

b[3]=78

数组的值是无法直接print(输出)的,使用for循环取出数值的下标,输出排序后的数组b下标值及对应数值,再把数组b的值当作数组a的下标值打印数组a的值。



19.

有一个文本文件data.test的内容如下:

0001|20081223efskjfdj|EREADFASDLKJCV

0002|20081208djfksdaa|JDKFJALSDJFsddf

0003|20081208efskjfdj|EREADFASDLKJCV

0004|20081211djfksdaa1234|JDKFJALSDJFsddf


awk -v FS="|" -v OFS="|" '{sub(/[0-9]+/,"",$2);print $0}' file3

0001|efskjfdj|EREADFASDLKJCV

0002|djfksdaa|JDKFJALSDJFsddf

0003|efskjfdj|EREADFASDLKJCV

0004|djfksdaa1234|JDKFJALSDJFsddf



20.

nslookup baidu.com 8.8.8.8|grep -oP "(?<=\s)(\d{2,}\.?){4}"

123.125.114.144

220.181.111.85

220.181.111.86


dig baidu.com|grep -oP '(?<=\sA\s)[^\s]*'

220.181.111.85

220.181.111.86

123.125.114.144



cat file

Code:200 Status:SUCCESS Status esc:SUCCESS ponse:Auth:1 Message Id:


grep -oP '(?<=esc:).+?(?=ponse)' file

SUCCESS


echo "2011-10-15 00:00:00,123,186027123456,0,176027123456,"|grep -Po '\d{5,}(?=,.+)'

186027123456


21.

cat file

test pool

test2 pool

test3 pool

ypnqas pool

sudsf pool

3

df

susian pool


awk '/pool/{p++;print p,b[p]++}' file

1 0

2 0

3 0

4 0

5 0

6 0


awk '/pool/{p++}{print p}' file

1

2

3

4

5

5

5

6


awk '/pool/{p++}END{print p}' file

6


awk '/pool/{p++;b[p]++}END{for(i=1;i<=p;i++)print p,b[i]}' file

6 1    

6 1

6 1

6 1

6 1

6 1


awk '/pool/{p++;print p,a[p],a[p]++,a[p]}' c

1  0 1

2  0 1

3  0 1

4  0 1

5  0 1

6  0 1


awk '/pool/{p++;b[p]++}{print b[p]++,b[p]}' file

1 2

1 2    

1 2

1 2

1 2

2 3

3 4

1 2


22.

如果文件a中包含文件b,则将文件b的记录打印出来

文件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


awk -F'[/,]' 'NR==FNR{a[$0]}NR>FNR{if($2 in a){print $0}}' b a

10/05766798607,11/20050325191329,29/0.1,14/05766798607


awk -F'[,/]' 'NR==FNR{a[$0]}NR>FNR{for(i in a)if($2~i)print $0}' b a

10/05766798607,11/20050325191329,29/0.1,14/05766798607


awk -F'[/,]' '{a[$0];getline<"d";if($2 in a){print $0}}' c

10/05766798607,11/20050325191329,29/0.1,14/05766798607


23.

cat a

1 0.5 100 10 15 36.5


cat b

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]=$i;getline<"b";for(i=1;i<NF;i++)printf $i+a[i]" ";printf $NF+a[NF]"\n"}' a


或者

awk '{for(i=1;i<=NF;i++)a[i]=$i;getline<"b";for(i=1;i<=NF;i++)printf $i+a[i]" ";print " "}' a

awk 'NR==FNR{for(i=1;i<=NF;i++)a[i]=$i}NR>FNR{for(i=1;i<=NF;i++)printf $i+a[i]" ";print " "}' a

(awk 'NR==FNR{for(i=1;i<=NF;i++)a[i]=$i}NR>FNR{for(i=1;i<=NF;i++){printf a[i]+$i" "}print " "}' a)


24.

cat file1

1000 北京市 地级 北京市 北京市

1100 天津市 地级 天津市 天津市

1210 石家庄市 地级 石家庄市 河北省

1210 晋州市 县级 石家庄市 河北省

1243 滦县 县级 唐山市 河北省

1244 滦南县 县级 唐山市 河北省


cat file2

110000,北京市

120000,天津市

130000,河北省

130131,平山县

130132,元氏县


file1中第二列在file2中可能有可能没有,需要把有的匹配起来生成新的一列:要包含file1和file2的第一列。没有匹配的按照file2原来的格式进行输出

awk 'BEGIN{FS="[ |,]";OFS=","}NR<=FNR{a[$2]=$1}NR>FNR{print $1,$2,a[$2]}' file1 file2

110000,北京市,1000

120000,天津市,1100

130000,河北省,

130131,平山县,

130132,元氏县,


或者awk -F'[, ]' -v OFS="," 'NR==FNR{a[$2]=$1}NR>FNR{if($2 in a)print $0,a[$2];if(!($2 in a))print $0}' file1 file2

110000,北京市,1000

120000,天津市,1100

130000,河北省

130131,平山县

130132,元氏县




有疑问

1.

cat file

aaa

bbb

ccc

ddd

eee

fff

ggg

hhh


pattern等于ddd时,取其前1行:

awk '/ddd/{print i};i=$0{}'

ccc


2.

cat file

aaa

bbb

ccc

ddd

eee

fff

ggg

hhh


pattern等于ddd时,取其后n行,以后3行为例

awk '/ddd/{p=1;x=NR}p&&NR-x<=3&&NR-x>0' file

eee

fff

ggg


或者awk '/ddd/{i=3;next}--i>=0' a

eee

fff

ggg


结果跟下面两个不同:

awk '/ddd/{x=NR}{m=$0}NR-x<=3&&x>0{print m}' file

ddd

eee

fff

ggg


awk '/ddd/{p=1;x=NR}p&&NR-x<=3&&x>0' a

ddd

eee

fff

ggg


_____

awk '/ddd/{x=NR}NR-x<=3&&x>0' a

ddd

eee

fff

ggg

 

awk '/ddd/{x=NR}NR-x<=3&&NR-x>0'

aaa
bbb
ccc
eee
fff
ggg

 

awk '/ddd/{x=NR}NR-x<=3'

aaa
bbb
ccc
ddd
eee
fff
ggg

 

awk '/ddd/{p=1;x=NR}p&&NR-x<=3&&x>0' a

ddd

eee

fff

ggg

 

(为啥不加x>0会出现aaa/bbb/ccc?awk按行读取,读到ddd前x为0,没有其他条件约束的话,会从第一行开始打印。加个条件x>0表示,读到ddd才开始打印输出。使用p=1也是同样的道理,读到ddd前p为0,读到ddd时p赋值为1,这时才开始打印输出。)



25.

cat file

001784  HCART3   ACS      3       -      -       15     91488   ACTIVE
001812  HCART3   ACS      3       -      -       15     94912   ACTIVE
fwefwrefwerfer
001812  HCART3   ACS      3       -      -       15     94912   ACTIVE
fwefwefwe
001812  HCART3   ACS      3       -      -       15     94912   ACT

 

统计ACTIVE行出现的次数:

awk '/ACTIVE/{p++}END{print p}'




你可能感兴趣的:(shell)