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.用awk的getline打印出与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
wuhai,hubei
awk 'BEGIN{FS="\n";RS=""}{x=1;while(x<NF){print $x"\t";x++}}' file
wangwu
13512345678
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
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}'