免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1142 | 回复: 0
打印 上一主题 下一主题

awk命令与实例 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-01-28 11:31 |只看该作者 |倒序浏览

收集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、将数据文件中的每个词的第一个字母变成大写
[email=dingyi@backup:~$]dingyi@backup:~$[/email]
cat test
linux is long live!!!
i am a cuer
[email=dingyi@backup:~$]dingyi@backup:~$[/email]
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 请教
  1. #!/bin/ksh
  2. sort -n file1>nf
  3. sort -n file2>mf
  4. paste nf mf|awk '$1=$3 {print}'|awk '$2!=$4 {print}'
  5. rm nf mf
  6. 结果:
  7. 00002 31 00002 32
  8. 00004 04 00004 56
  9. 00007 56 00007 28
  10. 00010 94 00010 52
复制代码

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 请教
三楼的答案是错的,我要是结果是
00002 31 32
00007 25 28

把$1相同,而$2不同的列出来
admirer 2003-9-12 00:45

awk 请教
这不是一个简单的paste能解决的问题,而是一个以关键字连接的问题!
  1. sort file1 >f1;sort file2 >f2; join -j1 1 f1 f2|awk '$2 != $3'
  2. 00002 31 32
  3. 00007 25 28
复制代码

killua 2003-9-12 03:30

awk 请教
[quote]原帖由 "yoof"]join -j1 1 f1 f2  请版主解释[/quote 发表:
以第一个文件的第一个域为索引键,连接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 ' #如果没有账号补上空格
else
>' tmp.txt > $2
awk '$nf~/[0-9]/
end' $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
read 置顶


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/57909/showart_472413.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP