一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

linux下awk命令语法及使用实例教程

时间:2015-11-25 编辑:简简单单 来源:一聚教程网

linux awk命令使用实例,awk是一种文本处理工具,在linux shell下尤为突出,

一个awk脚本通常由:BEGIN语句块、能够使用模式匹配的通用语句块、END语句块3部分组成,这三个部分是可选的。实例:

awk 'BEGIN{ print "start" } pattern{ commands } END{ print "end" }' file

BEGIN语句块在awk开始从输入流中读取行之前被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中。

END语句块在awk从输入流中读取完所有的行之后即被执行,比如打印所有行的分析结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块。

pattern语句块中的通用命令是最重要的部分,它也是可选的。如果没有提供pattern语句块,则默认执行{ print },即打印每一个读取到的行,awk读取的每一行都会执行该语句块。

比如有个test.txt文档,里面包含:

Frank
Testing 1
Hello World
TesT
123 Testing

一:awk '{ print }' test.txt
 
clvaluedqdqBook-Pro:~ clvaluedq$ awk '{ print }' test.txt
Frank
Testing 1
Hello World
TesT
123 Testing
 
二:awk正则表达式
 
clvaluedqdeBook-Pro:~ clvaluedq$ awk '/Test/ { print }' test.txt
Testing 1
123 Testing
 
三:awk '{ print $1 }' test.txt
 
clvaluedqdeBook-Pro:~ clvaluedq$ awk '{ print $1 }' test.txt
Frank
Testing
Hello
TesT
123

四:awk '{ print $2 }' test.txt
 
clvaluedqdeBook-Pro:~ clvaluedq$ awk '{ print $2 }' test.txt

World
 
Testing
 
五.awk '{ if($1 ~/123/)  print }' test.txt
 
clvaluedqdeBook-Pro:~ clvaluedq$ awk '{ if($1 ~/123/) print }' test.txt
123 Testing
 
六:grep -i test test.txt  | awk  '/[0-9]/{ print }'
 
clvaluedqdeBook-Pro:~ clvaluedq$ grep -i test test.txt | awk '/[0-9]/{ print }'
Testing 1
123 Testing
 
clvaluedqdeBook-Pro:~ clvaluedq$ grep -i test test.txt | awk '/^[0-9]/{ print }'#0-9开头
123 Testing

七:除此之外,awk还支持编程逻辑运算,比如数组循环
 
awk 'BEGIN{info="it is a test";tlen=split(info,tA," ");for(k=1;k<=tlen;k++){print k,tA[k];}}'
 
clvaluedqdqBook-Pro:~ clvaluedq$ awk 'BEGIN{info="it is a test";tlen=split(info,tA," ");for(k=1;k<=tlen;k++){print k,tA[k];}}'
1 it
2 is
3 a
4 test
 
八:设置处理字符串的函数 比如php的substr
 
awk 'BEGIN{info="this is a test2010test!";print substr(info,4,10);}'
 
clvaluedqdeBook-Pro:~ clvaluedq$ awk 'BEGIN{info="this is a test2010test!";print substr(info,4,10);}'
s is a tes





Linux awk 命令与实例

AWK介绍


1    调用awk

三种方式:
1.    命令行方式:    
awk [-F filed-separator] 'commands' input-files
-F    指定分隔符(默认是空格或tab)
commands    awk的命令
input-files    要处理的文件
2.    将所有awk命令插入一个文件,并使awk程序可执行,然后用awk命令解释器作为脚本的首行,以便通过键入脚本名称来调用它
3.    将所有的awk命令插入一个单独文件,然后调用:
awk -f awk-script-file input-files
-f    指明调用脚本名
input-files    待处理的文件

2    awk脚本
在命令中调用awk时,awk脚本由各种操作和模式组成。
awk每次读一条记录或一行,并使用指定的分隔符分隔指定域。当新行出现时,awk命令获悉已读完整条记录,然后在下一个记录启动读命令,这个读进程将持续到文件尾或文件不再存在。
2.1    模式和动作
任何awk语句都由模式和动作组成。模式部分决定动作语句何时触发及触发条件。处理即对数据进行的操作。如果省略模式部分,动作将时刻保持执行状态。
模式可以是任何条件语句、复合语句或正则表达式,包括两个特殊字段BEGIN和END。使用BEGIN语句设置计数和打印头。BEGIN语句用在任何文本浏览动作之前,之后文本浏览动作依据输入文件开始执行。END语句用在awk完成文本浏览动作后打印输出文本总数和结尾状态标志。如果不特别指明模式,awk总是匹配。
实际动作在大括号{}内指明。动作大多数用来打印,但还有些更长的代码诸如if和循环语句及循环退出结构。如果不指明采取动作,awk将打印出所有浏览出来的记录。
2.2    域和记录
awk执行时,其浏览域标记为$1,$2…$n,这种方法称为域标识。当需要指定多域时使用逗号,用于分隔,如$1,$3指定第一域和第三域,如果希望指定所有域可使用$0。
使用print命令执行打印操作,这是一个awk命令,需要用{}括起来。
1.    抽取域
举例: 现有一个grade.txt文件,内容如下:
$ cat grade.txt
M.Tansley        05/99    48311    Green    8    40    44
J.Lulu            06/99    48317    Green    9    24    26
P.Bunny        02/99    48        Yellow    12    35    28
J.Troll            07/99    4842    Brown-3    12    26    26
L.Tansley        05/99    4712    Brwon-2    12    30    28
此文本文件有7个域,以空格作为域分隔符
2.    保存awk输出
两种方式保存awk的输出结果:
重定向到文件:(屏幕无显示)
$ awk '{print $0}' grade.txt >wow
使用管道将输出结果传给tee:(屏幕显示结果)
$ awk '{print $0}' grade.txt|tee woww
3.    使用标准输入
几种方法:
$ belts.awk grade.txt
$ belts.awk < grade.txt
4.    打印所有记录
$ awk '{print $0}' grade.txt
5.    打印单独记录
只打印$1和$4:
$ awk '{print $1,$4}' grade.txt
6.    自定义格式打印
可以在$1和$4的上方添加注释,Name和Belt:
$ awk 'BEGIN {print "Name\t\tBelt\n-------------------------"} {print $1"\t"$4}' grade.txt
在结尾加上结束注释:
$ awk 'BEGIN {print "Name\t\tBelt\n-------------------------"} {print $1"\t"$4} END {print "-------------------------\nEnd of report"}' grade.txt
7.    awk错误信息提示
在碰到awk错误时,可相应查找:
•    确保整个awk命令用单引号括起来
•    确保命令内所有引号成对出现
•    确保用大括号{}括起动作语句,用括号()括起条件语句
•    可能忘记使用大括号{}
8.    awk键盘输入
如果没有给出输入文件,awk从键盘获得输入,完成后按结束输入
2.3    元字符
\ ^ $ . [ ] | ( ) * + ?
其中+和?只适用于awk而不适用于grep或sed:
+    匹配一个或一个以上前面的单字符
?    匹配0个或一个前面的单字符
举例:
/XY+Z/    匹配XYZ、XYYYYZ
/XY?Z/    匹配XYZ、XZ
2.4    条件操作符
操作符            描述
  <                小于
  <=              小于等于
  ==                等于
  !=               不等于
  >                大于
  >=              大于等于
  ~           匹配正则表达式
  !~          不匹配正则表达式
1.    匹配
使用~紧跟正则表达式可以匹配域,也可以用if,条件需要用()括起来
举例:
查询棕带学员的所有情况(打印出$4匹配Brown的行)
$ awk '{if ($4~/Brown/) print $0}' grade.txt

$ awk '$0 ~ /Brown/' grade.txt
2.    精确匹配
使用==并用双引号括起条件可以精确匹配条件
举例:
$ awk '{if ($3 == "48") print $0}' grade.txt
3.    不匹配
使用!~紧跟正则表达式不匹配域
举例:
查询不是棕带的所有学员情况(打印出$4不匹配Brown的行)
$ awk '{if ($4!~/Brown/) print $0}' grade.txt

$ awk '$0 !~ /Brown/' grade.txt
4.    比较
由于几个比较大小符的使用方法都一样,就随便举一个例子:
$ awk '{if ($6 < $7) print $1" try better at the next comp"}' grade.txt
5.    各种匹配
匹配Green或green:
$ awk '/[Gg]reen/' grade.txt
匹配$1的第四个字符是a:
$ awk '$1 ~ /^...a/' grade.txt
匹配Yellow或Brown:
$ awk '$4 ~ /Yellow|Brown/' grade.txt
匹配以J开头的行:
$ awk '$0 ~ /^J/' grade.txt
6.    复合表达式
复合模式或复合操作符用于形成复杂的逻辑操作,复合表达式即为模式间通过使用复合操作符互相结合起来的表达式
&&    AND:    符号两边必须同时为真
|| OR:    符号两边至少一边为真
! :    非 求逆
举例:
$ awk '{if ($1 == "P.Bunny" && $4 == "Yellow") print $0}' grade.txt
$ awk '{if ($4 == "Yellow" || $4 ~ /Brown/) print $0}' grade.txt
2.5    awk内置变量
awk有许多内置变量用来设置环境信息,常用的有:
ARGC        命令行参数个数
ARGV        命令行参数排列
ENVIRON        支持队列中系统环境变量的使用
FILENAME    awk读取的文件名
FNR            当前文件已处理的记录行数
FS            设置域分隔符,相当于-F
NF            域的列数
NR            已处理的记录总行数
OFS            设置输出字段域分隔符
RS/ORS        换行符

ARGC支持命令行中传入awk脚本的参数个数。ARGV是ARGC的参数排列数组,其中每一元素表示为ARGV[n],n为希望访问的命令行参数
ENVIRON支持系统设置的环境变量,要访问单独变量,使用实际变量名,如ENVIRON[“EDITOR”]=”Vi”
FILENAME为awk脚本当前操作文件的文件名
FNR为awk当前操作文件的记录行数,其值总是小于等于NR。如果脚本正在访问多个文件,每一新输入文件都将重置此变量
FS用来设置域分隔符,与命令行中-F相同,缺省为空格。如: 以冒号为分隔符FS=":"
NF为记录域个数(列数),在记录被读之后设置,常用$NF指定最后一列
OFS指定输出记录的域分隔符,缺省为空格。如: 以-为分隔符输出FS="-"
ORS与RS都为输出记录分隔符,缺省是新行(\n)
举例:
查看文件的记录数:
$ awk 'END {print NR}' grade.txt
打印所有记录及记录的行号及总域数,并在最后打印出读取文件的文件名:
$ awk '{print NF,NR,$0} END {print FILENAME}' grade.txt
至少包含一个记录且包含Brown:
$ awk '{if (NR > 0 && $4 ~ /Brown/) print $0}' grade.txt
NF的一个强大功能是将变量$PWD的返回值传入awk并显示其目录:
$ echo $PWD | awk -F/ '{print $NF}'
显示文件名:
$ echo "/usr/apache/conf/httpd.conf" | awk -F/ '{print $NF}'
2.6    awk操作符
awk操作符的基本表达式可以划分为数字型、字符串型、变量型域及数组元素
= += -= *= /= %= ^=            赋值操作符
?                        条件表达操作符
|| && !                    并、与、非
~ !~                        匹配操作符(匹配与不匹配)
< <= == != > >=                关系操作符
+ - * / % ^                算术操作符
++ --                        前缀和后缀
1.    设置输入域到域变量名
在awk中,设置有意义的域名是一种好习惯,在进行模式匹配或关系操作时更容易理解。一般的变量名设置方式为name=$n,这里name为调用的域变量名,n为实际域号。多个域名设置之间用分号;分隔(请注意下面;的使用)
$ awk '{name = $1;belts = $4; if (belts ~ /Yellow/) print name" is belt "belts}' grade.txt
2.    域值比较操作
有两种方式测试一数值域是否小于另一数值域:
1)    在BEGIN中给变量名赋值
2)    在关系操作符中使用实际数值
通常在BEGIN部分赋值是很有益的,可以在awk表达式进行改动时减少很多麻烦。使用关系操作时必须用圆括号括起来。举例:
查询所有比赛中得分在27点一下的学生:
$ awk '{if ($6 < 27) print $0}' grade.txt

$ awk 'BEGIN {BASELINE = "27"} {if ($6 < BASELINE) print $0}' grade.txt
3.    修改数值域取值
当在awk中修改任何域时,重要的一点是要记住实际输入文件是不可修改的,修改的只是保存在缓存里的awk复本。awk会在变量NR或NF中反映出修改痕迹
为修改数值域,简单的给域标识重赋新值。举例:
$ awk '{if ($1 == "M.Tansley") $6 = $6 - 1; print $1,$6,$7}' grade.txt
4.    修改文本域
修改文本域即对其重新赋值,赋给一个新的字符串。记住,字符串要使用双引号,并用圆括号括起整个语法。举例:
$ awk '{if ($1 == "J.Troll") ($1 = "J.L.Troll"); print $1}' grade.txt
5.    只显示修改记录
如果文件很大,修改的记录很多,所以需要只查看修改部分。在模式后面使用大括号{}将只打印修改部分。取得模式,再根据模式结果实施操作。举例:(注意大括号的位置)
$ awk '{if ($1 == "J.Troll") {$1 = "J.L.Troll"; print $1}}' grade.txt
6.    创建新的输出域
在awk中处理数据时,基于各域进行计算时创建新域是一种好习惯。创建新域要通过其他域赋予新域标识符。举例:
在grade.txt中创建新域8保存域目前级别分与域最高级别分的差值:
$ awk 'BEGIN {print "Name\tDifference"} {if ($6 < $7) {$8 = $7 - $6; print $1,$8}}' grade.txt
或者赋予便于理解的变量名:
$ awk 'BEGIN {print "Name\tDifference"} {if ($6 < $7) {diff = $7 - $6; print $1,diff}}' grade.txt
7.    增加列值
使用符号+=增加列数或进行运行结果统计。将符号右边的变量域的值赋给左边。
举例:
打印出所有学生的总成绩(将整个文件的$6求和,total为变量名):
$ awk '(total += $6); END {print "Club student total points: "total}' grade.txt
如果文件很大,只想打印结果部分而不是所有记录,在语句的外面加上大括号{}即可:
$ awk '{(total += $6)}; END {print "Club student total points: "total}' grade.txt
查看当前目录所有文件大小及总和(除去子目录):
$ ls -l|awk '/^[^d]/ {print $9"\t"$5} {total += $5} END {print "total Bytes: "total}'
2.9    内置的字符串函数
awk有很多强大的字符串函数:
gsub(r,s,t)                在整个字符串t中用字符串s替代所有满足正则表达式r的字符串(如没指定t则默认为$0)
index(s,t)                返回字符串s中字符串t第一次出现的位置(如不存在则为0)
length(s)                返回s字符串的长度(如没指定s则默认为$0)
match(s,r)            返回第一个满足正则表达式r的字符串在s字符串里面的位置(如无匹配的则为0)
split(s,a,sep)            使用sep将字符串s分隔成为数组a的元素,返回数组元素的数量(如果没指定分隔符则默认与FS相同用法)
sprint("fmt",exp)        使用printf的格式说明对表达式exp 进行格式化输出
sub(r,s,t)                在字符串t中用s字符串替换满足正则表达式r的第一个字符串,返回1如果成功,否则返回0(如没指定t则默认为$0)
substr(s,p,n)            返回字符串s中以p位置开始长度为n的字符串(如果没指定n则返回从p位置开始的所有字符串)
tolower(s)            将字符串s中的所有大写字母转换为小写,返回转换后的字符串
toupper(s)            将字符串s中的所有小写字母转换为大写,返回转换后的字符串
1.    gsub(r,s,t)
在整个字符串t中用字符串s替代所有满足正则表达式r的字符串(如没指定t则默认为$0):
$ awk 'gsub(/4842/,4899) {print $0}' grade.txt

$ awk '{if (gsub(/4842/,4899)) print $0}' grade.txt
2.    index(s,t)
返回字符串s中字符串t第一次出现的位置(如不存在则为0)。必须用双引号将字符串都括起来:
$ awk 'BEGIN {print index("Benny","ny")}' grade.txt
3.    length(s)
返回s字符串的长度(如没指定s则默认为$0):
$ awk '$1 == "J.Troll" {print length($1)" "$1}' grade.txt
$ awk 'BEGIN {print length("Kevin is a good boy.")}'
4.    match(s,r)
返回第一个满足正则表达式r的字符串在s字符串里面的位置:
$ awk 'BEGIN {print match("ANCD",/d/)}'(返回0)
$ awk '$1=="J.Lulu" {print match($1,/u/)}' grade.txt(返回第一个u在J.Lulu里的位置: 3)
5.    split(s,a,sep)
使用sep将字符串s分隔成为数组a的元素,返回数组元素的数量:
$ awk 'BEGIN {print split("123#456#789",array,"#")}'
返回3,数组array的元素分别为:
array[1]="123"
array[2]="456"
array[3]="789"
6.    sub(r,s,t)
在字符串t中用s字符串替换满足正则表达式r的第一个字符串,返回1如果成功,否则返回0(如没指定t则默认为$0):
$ awk '$1 == "J.Troll" {if (sub(/26/,"29")) print}' grade.txt
7.    substr(s,p,n)
返回字符串s中以p位置开始长度为n的字符串(如果没指定n则返回从p位置开始的所有字符串):
$ awk '$1 == "L.Tansley" {print substr($1,1,5)}' grade.txt(返回L.Tan)
如果给定长度值n大于字符串长度,则awk将从起始位置返回所有字符:
$ awk '$1 == "L.Tansley" {print substr($1,3,15)}' grade.txt(返回Tansley)
如果没指定n,则awk将从起始位置返回所有字符:
$ awk '{print substr($1,3)}' grade.txt
在BEGIN部分定义字符串,在END部分返回抽取的字符:
$ awk 'BEGIN {STR="Kevin is a good boy."} END {print substr(STR,12,8)}' grade.txt
8.    从shell中向awk传入字符串
$ echo "Stand-by"|awk '{print length($0)}'
设置文件名为一变量,取文件名:
$ STR="grade.txt"
$ echo $STR|awk '{print substr($STR,1,5)}'
取文件名后缀:
$ STR="grade.txt"
$ echo $STR|awk '{print substr($STR,7) }'
2.10    awk输出函数printf
awk提供函数printf,拥有几种不同的格式化输出功能。每一种printf函数(控制格式字符)都以一个%符号开始,以一个决定转换的字符结束。转换包含三种修饰符。
语法:
printf "格式控制符",参数

awk printf修饰符
-        左对齐
Width    域的步长,用0表示0步长
.prec    最大字符串长度,或小数点右边的位数

awk printf格式
%c        ASCII字符
%d        整数
%e        浮点数(科学记数法)
%f        浮点数
%g        awk决定使用哪种浮点数转换(e或者f)
%o        八进制数
%s        字符串
%x        十六进制数
举例:
字符转换:
$ awk 'BEGIN {printf "%c\n",65}' grade.txt
格式化输出:
打印所有的学生名字和序列号,要求名字左对齐,15个字符长度,后跟序列号:
$ awk '{printf "%-15s %s\n",$1,$3}' grade.txt
再加入注释:
$ awk 'BEGIN {print "Name\t\tNumber"} {printf "%-15s %s\n",$1,$3}' grade.txt
2.11    向一行awk命令传值
在awk执行前将值传入awk变量,需要将变量放在命令行下,格式:
awk 命令变量=输入文件值
举例:
$ awk '{if ($5 < AGE) print $0}' AGE=10 grade.txt
查询可用空间小于36000M的分区:
$ df -m|awk '($4 ~ /^[0-9]/) {if ($4 < LIMIT) print $6"\t"$4}' LIMIT=36000
awk也允许传入环境变量。举例:
查询当前用户登陆在哪个端口:
$ who|awk '{if ($1 == user) print $1" you are connected to "$2}' user=$LOGNAME
2.12    awk脚本文件
可以将awk脚本写入一个文件再执行它。使用awk脚本的好处是不比每次使用时都需要重新输入,并且可以增加注释便于理解。拿一个awk脚本举例:
#!/bin/awk -f
# all comment lines must start with a hash '#'
# name: student_total.awk
# to call: student_total.awk grade.txt
# prints total and average of club student points

# print a header first
BEGIN{
print "Student\t\tDate\tNumber\tGrade\tAge\tPoints\tMax"
print "Name\t\tJoined\t\t\t\tGained\tPoint Available"
print "========================================================================"
}

# let's add the scores of points gained
(total += $6)

# finished processing now let's print the total and average point
END {
print "Club Student Total points: " total
print "Average Club Student points: " total/NR
}
第一行是#!/bin/awk -f,这一行很重要,没有它脚本将不能执行,因为它告知脚本系统中awk的位置。通过将命令分开,脚本的可读性提高,还可以在命令之间加入注释。
执行时在脚本文件后键入文件名,但需要先赋予可执行权限。
2.13    在awk中使用FS变量
使用awk脚本时,设置FS变量是在BEGIN部分。如果不这样,awk不知道域分隔符是什么。
脚本举例:(该脚本从/etc/passwd中抽取第一和第五域)
#!/bin/awk -f
# to call: passwd.awk /etc/passwd
# print out the first and fifth fields
BEGIN {
FS=":"}
{print $1,"\t",$5}

2.14    向awk脚本传值
向awk脚本传值与向awk命令行传值方式大体相同,格式:
awk_script var=value input_file
举例:
#!/bin/awk -f
# name: age.awk
# to call: age.awk AGE=n grade.txt
# prints ages that are lower than the age supplied on the command line
{if ($5 < AGE)
print $0}
执行方式:(别忘了先赋予可执行权限)
$ ./age.awk AGE=10 grade.txt
也可以使用管道命令将命令的结果传递给awk脚本,如
$ cat grade.txt |./ student_total.awk
2.15    awk数组
数组使用前不必定义,也不必指定数组元素个数。经常使用循环来访问数组,下面是一种循环类型的基本结构:
for (element in array) print array[element]
举例:(前面提到过的字符串123#456#789)
#!/bin/awk -f
# name: arraytest.awk
# prints out an array
BEGIN {
record="123#456#789";
split(record,array,"#")
}
END {
for (i in array) {
print array[i]
}
}
使用/dev/null作为输入运行脚本:
$ ./arraytest.awk /dev/null

从指定文本里找出匹配条件的项及其出现的次数
#!/bin/awk -f
# name: count.awk
# to call: count.awk grade2.txt
# loops through the grade2.txt file and counts how many belts we have in(yellow, orange, red)
# also count how many adults and juniors we have
# start of BEGIN
# set FS and load the arrays with our values
BEGIN {FS="#"
# load the belt colours we are interested in only
belt["Yellow"]
belt["Orange"]
belt["Red"]
# end of BEGIN
# load the student type
student["Junior"]
student["Senior"]
}
# loop thru array that holds the belt colours against field-1
# if we have a match, keep a running total
{for (colour in belt)
  {if ($1 == colour)
  belt[colour]++}}
# loop thru array that holds the student type against
# field-2 if we have a match, keep a running total
{for (senior_or_junior in student)
  {if ($2 == senior_or_junior)
  student[senior_or_junior]++}}

# finished processing so print out the matches..for each array
END {for (colour in belt) print "The club has", belt[colour], colour, "Belts"

for (senior_or_junior in student) print "The club has", student[senior_or_junior], senior_or_junior, "students"}
BEGIN部分设置域分隔符为#,初始化两个数组的内容元素。然后处理文件,先给数组命名为colour,使用循环语句比对$1是否等于数组元素之一(Yellow、Orange或Red),如果匹配,依照匹配元素将运行总数保存进数组。同样的方法处理数组senior_or_junior。END部分打印浏览结果,对每一个数组使用循环语句并打印


收集awk的一些技巧方案
awk [opion] 'awk_script' input_file1 [input_file2 ...] awk的常用选项option有:
① -F fs : 使用fs作为输入记录的字段分隔符,如果省略该选项,wak使用环境变量IFS的值。
② -f filename : 从文件filename中读取awk_script。
③ -v var=value : 为awk_script设置变量。
1、删除重复的行
#awk '!a[]++'

2、将数据文件中的每个词的第一个字母变成大写
dingyi@backup:~$ cat test
linux is long live!!!
i am a cuer

dingyi@backup:~$ awk ',1,1); sub(/^./,toupper(first),); print }' test
Linux is long live!!!
I am a cuer

awk 请教

下面是文件一,文件二
  $cat file1
00001       20
00002       31
00003       04
00004       56
00005       94
00006       73
00007       25
00008       86
00009       19
00010       52
$cat file2
00001       20
00007       28
00002       32
00004       56
00010       52
怎样的shell才能使file1、file2两个文件的$2不同的话,取出全局$0?
注意:比较两个文件的$2的时候,一定要第一列相同的情况下才比较
请大虾执教
li2002 2003-9-11 08:57
 
awk 请教

不就是找出不同行吗?
cat file1 file2|sort |uniq -u
deathcult 2003-9-11 09:15
 
awk 请教
paste file1 file2|awk '{if(($1==$3)&&($2!=$4))print$0}'
bjgirl 2003-9-11 09:38
 
awk 请教
[code]
#!/bin/ksh
sort -n file1>nf
sort -n file2>mf
paste nf mf|awk '$1=$3 {print}'|awk '$2!=$4 {print}'
rm nf mf
结果:
00002 31 00002 32
00004 04 00004 56
00007 56 00007 28
00010 94 00010 52
[/code]
killua 2003-9-11 10:05
 
awk 请教
回一楼,最近在学awk啦,而且你那样得到的数值是
00002 31
00002 32
00003 04
00005 94
00006 73
00007 25
00007 28
00008 86
00009 19
00010 52
00010 52
而我要的是
00002 31  32
00007 25  28
 
 

二楼的没有数值哦,而且应该是paste file1 file2|awk '{if ($1 == $3 && $2 != $4) print $0}'[/quote]

awk 请教
三楼的答案是错的,我要是结果是
[color=red]00002 31 32
00007 25 28
[/color]
把$1相同,而$2不同的列出来
admirer 2003-9-12 00:45
 
awk 请教
这不是一个简单的paste能解决的问题,而是一个以关键字连接的问题!
[code]sort file1 >f1;sort file2 >f2; join -j1 1 f1 f2|awk '$2 != $3'
00002 31 32
00007 25 28[/code]
killua 2003-9-12 03:30

 
awk 请教
[quote][i]原帖由 "yoof"]join -j1 1 f1 f2  请版主解释[/quote 发表:[/i]
以第一个文件的第一个域为索引键,连接f1,f2两个文件


文件处理

1.有文件gz.txt(工资)

4367422926350133100 张三 1250.00

4367422926351220178 李四 1300.00

4367422926351220546 王二 0

苏五丙 1340.00

4367422926351220178 孙六月 1390.00

…… ……

要求:按账号19位、姓名8位、工资8位来排列,且如姓名不足8位在之后补足,工资不足8位则在工资之前补。同时要求去掉工资为0的名单,没有账号在前补19位空格,并输出工资总数加以核对,处理后应如下排列:

4367422926350133100张三 1250.00

4367422926351220178李四 1300.00

苏五丙 1340.00

4367422926351220178孙六月 1390.00

…… ……

awk程序:

#------------------------------------

#shgz1.sh

sblank=" "

awk '$nf!="0"' $1 > tmp.txt #删除工资为0的人数

awk '<

if($1!~/[0-9]/)<

printf("%-19.19s%-8.8s%8.2f\n","'"$kk"'",$1,$2)> #如果没有账号补上空格

else<

printf("%-19.19s%-8.8s%8.2f\n",$1,$2,$3)>

>' tmp.txt > $2

awk '$nf~/[0-9]/<

sum=sum+$nf

>

end<

system("rm tmp.txt")

printf("the sum is%16.2f!\n", sum) #输出工资总数

>' $2

在awk中调用系统变量必须用单引号,如果是双引号,则表示字符串
Flag=abcd
awk '{print '$Flag'}' 结果为abcd
awk '{print "$Flag"}' 结果为$Flag
如何删除匹配之间的内容但不包括匹配行
 
我有这样一个文件:
Query=4567879
    sequence jkaskdjgkjasgasa;jghsafgkas
    jfaklslgjdla;;gsdakl;gd

score     E
PUT-ASD-WEETED-001
PUT-ASD-WEQER5-001789
>PUT-ASD-WEETED-001
SDAGDSDS
>PUT-ASD-WEQER5-001789
DSGTSDTEW
.....
......
......
是这样的,我想删除
从score     E
到以第一个以>开头的中间所有的行,但不包括score     E行和第一以>开头的行

sed '/score     E/,/^>/d' urfile
肯定是不行的,把score     E行和第一以>开头的行也删掉了?
该怎么写呢?
其中要处理的文件中含有多个score     E和第一以>开头的之间的行,均删掉。
 
 
awk -v p=1 '/score/{p=0}/>/{p=1}p' urfile

热门栏目