免费注册 查看新帖 |

Chinaunix

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

请教两个AWK的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-12-02 18:11 |只看该作者 |倒序浏览
本帖最后由 ambious888 于 2010-12-02 18:14 编辑

请教两个AWK的问题

第一个问题
file1
a
b:y
c:z

file2
x:1
z:3
y:2

想要得到的结果
a:1
b:2
c:3

衍生下面一个问题

如果
file1
a
b:y
c:m

file2
x:1
z:3
y:2

m没有在file2中,希望得到的结果是
a:1
b:2
c:null


第二个问题
file1
a
b:y
c:z
如何把第二列格式化成
file1
a:1
b:1
c:1

Thanks!

论坛徽章:
0
2 [报告]
发表于 2010-12-02 18:25 |只看该作者
第一个问题  
awk 'BEGIN{FS=":"}FNR==NR{a[$2]=$1;next}{if($1 in a) print a[$1]":"$2; else print a[$1]":null"}'  file1 file2
第二个
awk 'BEGIN{OFS=FS=":"}{$2=1}1' file

论坛徽章:
0
3 [报告]
发表于 2010-12-02 19:54 |只看该作者
本帖最后由 zzy7186 于 2010-12-02 19:56 编辑

回复 2# lkk2003rty


第一个好像不行啊a[$1] 为空 而输出 :null
下面第一问很挫的办法:
sort -t: -k 2 -o file1 file1
sort -t: -k 1 -o file2 file2
join -t: -1 2 -2 1 -o 1.1 2.2 -a 1 file1 file2 | awk -v FS=":" -v OFS=":" '{if($2=="")$2="null";print $1,$2}' | sort

论坛徽章:
0
4 [报告]
发表于 2010-12-02 20:21 |只看该作者
回复 3# zzy7186


    确实  这个没注意 改正下
awk 'BEGIN{FS=":"}FNR==NR{a[$2]=$1;next}{if($1 in a) a[$1]=a[$1]":"$2}END{for(i in a)if(index(a,":"))print a;else print a":null"}'  file1 file2

论坛徽章:
0
5 [报告]
发表于 2010-12-02 21:06 |只看该作者
回复 4# lkk2003rty


    后面index(a,":") 能解释下吗?
   在我这运行好像报错啊
   awk 'BEGIN{FS=":"}FNR==NR{a[$2]=$1;next}{if($1 in a) a[$1]=a[$1]":"$2}END{for(i in a)if(index(a,":"))print a;else print a":null"}' a c
    awk: (FILENAME=c FNR=3) fatal: attempt to use array `a' in a scalar context

论坛徽章:
0
6 [报告]
发表于 2010-12-02 21:18 |只看该作者
我的执行也出同样的错了

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
7 [报告]
发表于 2010-12-03 04:13 |只看该作者
awk -F [":"] 'NR==FNR {a[$1]=$2} NR!=FNR {print $1":"a[$2]}' file2 file1 | awk  -F [":"] '{if(length($NF)==0) print $1":null"; else {print}}'

论坛徽章:
0
8 [报告]
发表于 2010-12-03 09:20 |只看该作者
回复 5# zzy7186


    诶。。。我复制错了?! 查了下history 是这样的
  awk 'BEGIN{FS=":"}FNR==NR{a[$2]=$1;next}{if($1 in a) a[$1]=a[$1]":"$2}END{for(i in a)if(index(a,":"))print a;else print a":null"}'  file1 file2
code起来看看
  1. awk 'BEGIN{FS=":"}FNR==NR{a[$2]=$1;next}{if($1 in a) a[$1]=a[$1]":"$2}END{for(i in a)if(index(a[i],":"))print a[i];else print a[i]":null"}'  file1 file2
复制代码
诡异。。。。昨天怎么复制的。。。。

论坛徽章:
0
9 [报告]
发表于 2010-12-03 09:24 |只看该作者
晕  原来没有code起来差这么多。。。。囧。。。。

论坛徽章:
0
10 [报告]
发表于 2010-12-10 23:33 |只看该作者
回复 7# yinyuemi

谢谢解答,下面我对具体的命令庖丁解牛啊

-bash-3.2$ more test1 test2
::::::::::::::
test1
::::::::::::::
a:1
b:y:2
c:z:3
d:a:3
::::::::::::::
test2
::::::::::::::
x:pwd1
z:pwd3
y:pwd2
-bash-3.2$


    awk -F [":"] 'NR==FNR {a[$1]=$2} NR!=FNR {print $1":"a[$2]}' test2 test1 | awk  -F [":"] '{if(length($NF)==0) print $1":null"; else {print}}'


  我是这样理解的,如果有错误请予以更正

    awk -F [":"]   分隔符为:
    'NR==FNR      第一个文件
    {a[$1]=$2}   第一个文件(test2)以:分割的第二个域放到以第一个域为下标的数组a中  如a[x]=pwd1  a[y]=pwd2
     NR!=FNR       第二个文件
    {print $1":"a[$2]}'   这里的$1是第二个文件的 如a , b , c  这时候的a[$2] 是以第二个文件(test1)的第二个域为数组的下标到数组a中搜索,第二个文件的第二个域是x y z,这时候就找到了数组中对应的a[x] a[y]中存储的值,如果没找到也没关系
     test2            第一个文件
     test1            第二个文件
     |                   结果输出来继续处理
     awk  -F [":"]
     '{if
          (length($NF)==0)  判断最后一个域的长度是否为0
          print $1":null";      如果有最后一个域的长度为0,打印null
      else
          {print}                  否则打印全部
      }'
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP